gpt4 book ai didi

Haskell ZeroMQ 绑定(bind)不适用于 REQ 套接字

转载 作者:行者123 更新时间:2023-12-02 13:09:00 24 4
gpt4 key购买 nike

所以我几乎无法在 Windows 桌面上安装 libzmq,然后使用 cabal 安装 Zeromq-haskell。我想通过在 hello-world 类型应用程序中将 python 程序与 haskell 程序绑定(bind)来测试 api。

所以我看到的最基本的模式是请求-回复模式。首先,我尝试用 haskell (REP) 制作服务器,用 python (REQ) 制作客户端,无论我做什么,都惨败。生成的异常消息为 Exception: receive: failed (No error)。

所以我查看了 System.ZMQ 和 System.ZMQ.Base 源代码,我发现 receive 在调用 c_zmq_recv 时抛出错误,反过来直接映射到对 C api 的 ffi (?) 调用。所以我想也许我没有正确安装,但后来我尝试在 Haskell 中创建客户端,在 python 中创建服务器,我发现它工作没有任何问题,所以也许这里的问题不是recv接口(interface)。

这是下面的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 客户端可能更好,但我很好奇天气我做错了什么或者我的代码的任何部分是否以任何方式被破坏。

提前致谢

最佳答案

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

尝试更改connect socket "tcp://127.0.0.1:5554"bind socket "tcp://127.0.0.1:5554"serverMain功能。

关于Haskell ZeroMQ 绑定(bind)不适用于 REQ 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10913063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com