【问题标题】:Haskell ZeroMQ binding not working for REQ socketHaskell ZeroMQ 绑定不适用于 REQ 套接字
【发布时间】:2012-06-06 11:13:26
【问题描述】:

所以我在这里,几乎无法在 Windows 桌面上安装 libzmq,然后用 cabal 安装 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 客户端可能更好,但我很好奇天气我做错了什么,或者我的代码的任何部分是否以任何方式损坏。

提前致谢

【问题讨论】:

  • 你得到什么错误?哪个版本的 zeromq?
  • 错误是异常:接收并且我使用的版本是2.2(无法在我的Windows机器上成功构建3.2)
  • 您是否尝试将serverMain 函数包装在withSocketsDo 中,如network docs 中所示?我之前没有在 Windows 上使用过network,但我确实记得这个小问题。
  • withSocketsDo 函数没有区别。同时我检查了python库版本,那是 2.1.1 。版本之间会不会有这么大的不兼容?

标签: haskell zeromq message-passing


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2013-10-05
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多