所以我在这里,几乎无法在 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 客户端可能更好,但我对天气很好奇我'我做错了什么,或者我的代码的任何部分以任何方式损坏。
提前致谢