だからここで私は、libzmqをWindowsデスクトップにインストールしてから、zeromq-haskellとcabalをインストールすることがほとんどできませんでした。hello-worldタイプのアプリケーションでPythonプログラムをhaskellプログラムにバインドしてAPIをテストしたかったのです。
したがって、私が見る最も基本的なパターンは、要求と応答のパターンです。最初に、サーバーをhaskell(REP)で、クライアントをpython(REQ)で作成しようとしましたが、何をしてもwitchは惨めに失敗しました。生成された例外メッセージは、例外:受信:失敗(エラーなし)でした。
したがって、System.ZMQおよびSystem.ZMQ.Baseソースコードの内部を見ると、receiveがc_zmq_recvの呼び出しでエラーをスローし、witchがC apiへのffi(?)呼び出しに直接マップしていることがわかります。だから私はおそらくインストールを適切に行わなかったと思いますが、Haskellでクライアントを作成し、Pythonでサーバーを作成しようとすると、問題なく動作することに気付きます。したがって、おそらくここではrecvインターフェイスは問題ではありません。
以下は、クライアント機能とサーバー機能の両方を備えたhaskellコードです。
import System.ZMQ
import Control.Monad (forM_,forever)
import Data.ByteString.Char8 (pack,unpack)
import Control.Concurrent (threadDelay)
clientMain :: IO ()
clientMain = withContext 1 (\context->do
putStrLn "Connecting to server"
withSocket context Req $ (\socket-> do
connect socket "tcp://127.0.0.1:5554"
putStrLn $ unwords ["Sending request"]
send socket (pack "Hello...") []
threadDelay (1*1000*1000)
reply<-receive socket []
putStrLn $ unwords ["Received response : ",unpack reply]))
serverMain :: IO ()
serverMain = withContext 1 (\context-> do
putStrLn "Listening at 5554"
withSocket context Rep $ (\socket-> do
connect socket "tcp://127.0.0.1:5554"
forever $ do
message<-receive socket [] -- this throws an IO Exception
putStrLn $ unwords ["Received request : ",unpack message]
threadDelay (1*1000*1000)
send socket (pack "World") [] ))
main :: IO ()
main = serverMain -- replace with clientMain and it works
今、私は実際に他のすべての通信モード(プッシュ/プル、サブスクライブ/公開、ペアリングなど)をテストすることはできませんでした。必要なものについては、Pythonサーバー/ Haskellクライアントの方がおそらく優れていますが、天気に興味があります。 m何か間違ったことをしている場合、またはコードの一部が何らかの形で壊れている場合。
前もって感謝します