Haskell ZeroMQ绑定不适用于REQ套接字

时间:2012-06-06 11:13:26

标签: haskell zeromq message-passing

所以我在这里,几乎无法在Windows桌面上安装libzmq,然后在caber中安装zeromq-haskell。我想通过在hello-world类型的应用程序中将python程序与haskell程序绑定来测试api。

所以我看到的最基本的模式是请求 - 回复模式。首先我试图用haskell(REP)和python(REQ)中的客户端制作服务器,无论我做了什么,女巫都失败了。生成的异常消息为Exception:receive:failed(No error)。

所以我查看System.ZMQ和System.ZMQ.Base源代码,我看到接收在调用c_zmq_recv时抛出错误,而女巫反过来直接映射到对C api的ffi(?)调用。所以我想也许我没有正确安装,但后来我尝试在Haskell和python中的服务器中创建客户端,我注意到它没有任何问题,所以也许这里的recv接口不是问题。 / p>

下面是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客户端可能更好但我很好奇天气我做错了,或者我的代码的任何部分都以任何方式被破坏了。

提前致谢

1 个答案:

答案 0 :(得分:2)

你需要让其中一个套接字(通常是服务器)绑定,你似乎都将它们连接起来。

尝试在connect socket "tcp://127.0.0.1:5554"函数中将bind socket "tcp://127.0.0.1:5554"更改为serverMain