4

だからここで私は、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何か間違ったことをしている場合、またはコードの一部が何らかの形で壊れている場合。

前もって感謝します

4

1 に答える 1

2

ソケットの 1 つ (通常はサーバー) をバインドする必要があります。両方が接続されているようです。

関数内で に変更connect socket "tcp://127.0.0.1:5554"してみてください。bind socket "tcp://127.0.0.1:5554"serverMain

于 2012-06-14T12:41:39.837 に答える