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

所以我在这里,几乎无法在
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接口不是问题.

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

提前致谢

最佳答案 您需要使其中一个套接字(通常是服务器)绑定,您似乎将它们都连接起来.

尝试更改连接套接字“tcp://127.0.0.1:5554”以在serverMain函数中绑定套接字“tcp://127.0.0.1:5554”.

点赞