【发布时间】: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