gpt4 book ai didi

haskell - 为什么 ZeroMQ REQ/ROUTER 示例未收到任何消息?

转载 作者:行者123 更新时间:2023-12-02 21:25:18 26 4
gpt4 key购买 nike

ZeroMQ: Messaging for Many ApplicationsREQ -> ROUTER 通信的评论:

If we rewrote our “Hello World” server using ROUTER, we’d be able to process any number of “Hello” requests in parallel.

所以我输入了 hwclient.hs并稍微修改了 hwserver.hs来自 ZeroMQ 指南:

Hello World 客户端

{-# LANGUAGE OverloadedStrings #-}

-- Hello World client

module Main where

import Control.Monad
import System.ZMQ4.Monadic

main :: IO ()
main = runZMQ $ do
liftIO $ putStrLn "Connecting to hello world server…"

requester <- socket Req
connect requester "tcp://localhost:5555"

forM_ [1..10] $ \i -> do
liftIO . putStrLn $ "Sending Hello " ++ show i ++ "…"
send requester [] "Hello"
_ <- receive requester
liftIO . putStrLn $ "Received World " ++ show i

和路由器:

Hello World 路由器

{-# LANGUAGE OverloadedStrings #-}

-- Hello World server

module Main where

import Control.Concurrent
import Control.Monad
import System.ZMQ4.Monadic

main :: IO ()
main = runZMQ $ do
-- Socket to talk to clients
responder <- socket Router
bind responder "tcp://*:5555"

forever $ do
buffer <- receive responder
liftIO $ do
putStrLn "Received Hello"
threadDelay 1000000 -- Do some 'work'
send responder [] "World"

但是,当我运行它时,我看到客户端发送一条消息,但从未收到响应。

$stack exec -- client-exe
Connecting to hello world server…
Sending Hello 1…

在我的另一个窗口中,我看到服务器收到了 3 条消息,仅此而已:

$stack exec -- server-exe
Received Hello
Received Hello
Received Hello

问题1:为什么客户端从来没有收到回复?
Q2:为什么服务器(ROUTER)收到 3 条消息而不是 1 条?

编辑

我更新了 hwserver.hs 以打印出它收到的消息,而不仅仅是“Hello”。

发布差异:

printf "received request: %s\n" . unpack $ buffer

已替换

putStrLn "Received Hello"

服务器(路由器)显示:

$stack exec -- server-exe
received request: A§
received request:
received request: Hello

最后,这是 send 的函数签名:

λ: :t send
send
:: Sender t =>
Socket z t
-> [Flag] -> Data.ByteString.Internal.ByteString -> ZMQ z ()

最佳答案

按相反顺序回答...

您的 3 条“消息”是收到消息的 3 帧。第一帧由路由器套接字添加,以识别消息的来源。第二个是请求者套接字添加的空分隔符帧,最后一个帧包含您发送的数据。

这导致了为什么您没有得到响应,当经销商套接字发送消息时,它会剥离第一个消息帧并将其用作地址来识别需要回复的客户端。由于您没有保存收到的第一帧并将其附加到传出消息中,因此它将被删除。

遗憾的是,我对 haskell 或其 Zeromq 绑定(bind)了解不够,无法为您提供代码解决方案,但如果您接收到地址缓冲区,直到读取空数据包,然后将数据包读入数据缓冲区。回复时发送地址缓冲区、空缓冲区,然后发送回复。

关于haskell - 为什么 ZeroMQ REQ/ROUTER 示例未收到任何消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37625833/

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