所以我在这里,几乎无法在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客户端可能更好但我很好奇天气我做错了,或者我的代码的任何部分都以任何方式被破坏了。
提前致谢
答案 0 :(得分:2)
你需要让其中一个套接字(通常是服务器)绑定,你似乎都将它们连接起来。
尝试在connect socket "tcp://127.0.0.1:5554"
函数中将bind socket "tcp://127.0.0.1:5554"
更改为serverMain
。