4

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

提前致谢

4

1 回答 1

2

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

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

于 2012-06-14T12:41:39.837 回答