所以我在这里,几乎无法在
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”.