Scala 经销商路由器设置中的路由器挂起
如果尝试将1Scala 经销商路由器设置中的路由器挂起,scala,zeromq,Scala,Zeromq,如果尝试将1经销商连接到1路由器: package net.async import org.zeromq.ZMQ import org.zeromq.ZMQ.Socket import scala.annotation.tailrec object Client { val Empty = "".getBytes def message(x: Int) = s"HELLO_#$x".getBytes val Count = 5 } class Cli
经销商
连接到1路由器
:
package net.async
import org.zeromq.ZMQ
import org.zeromq.ZMQ.Socket
import scala.annotation.tailrec
object Client {
val Empty = "".getBytes
def message(x: Int) = s"HELLO_#$x".getBytes
val Count = 5
}
class Client(name: String) extends Runnable {
import Client._
import AsyncClientServer.Port
override def run(): Unit = {
val context = ZMQ.context(1)
val dealer = context.socket(ZMQ.DEALER)
dealer.setIdentity(name.getBytes)
dealer.connect(s"tcp://localhost:$Port")
runHelper(dealer, Count)
}
@tailrec
private def runHelper(dealer: Socket, count: Int): Unit = {
dealer.send(dealer.getIdentity, ZMQ.SNDMORE)
dealer.send(Empty, ZMQ.SNDMORE)
dealer.send(message(count), 0)
println(s"Dealer: ${dealer.getIdentity} received message: " + dealer.recv(0))
runHelper(dealer, count - 1)
}
}
object AsyncClientServer {
val Port = 5555
val context = ZMQ.context(1)
val router = context.socket(ZMQ.ROUTER)
def main(args: Array[String]): Unit = {
router.bind(s"tcp://*:$Port")
mainHelper()
new Thread(new Client("Joe")).start()
}
private def mainHelper(): Unit = {
println("Waiting to receive messages from Dealer.")
val identity = router.recv(0)
val empty = router.recv(0)
val message = router.recv(0)
println(s"Router received message, ${new String(message)} from sender: ${new String(identity)}.")
mainHelper()
}
}
我看到以下输出,挂在第二条消息上
[info] Running net.async.AsyncClientServer
[info] Waiting to receive messages from Dealer.
这是为什么?不确定这是否是您的问题的原因,但您不需要从经销商处发送标识框,zeromq将为您执行此操作。通过添加它,您实际上发送了一条由4部分组成的消息
IDENTITY
IDENTITY
EMPTY
CONTENT
它会将身份和空骰子附加到经销商发送方或路由器接收方?实际上,在半睡眠状态下应答是不好的。经销商确实需要附加空帧(以及它以前拥有的任何路由信息,在您的案例中没有任何内容),但不需要附加它自己的标识。这将由接收消息的路由器套接字添加。但是
路由器
在与经销商
通话时,必须发送三帧消息:[IDENTITY][EMPTY][message]
?。另外-请编辑您的答案好吗?编辑后的答案。是的,路由器需要发送地址帧、空帧,然后是内容帧。@drozzy-关于mainheloper
的阻塞,你是对的。我需要在新线程(新客户端(…)
调用之后移动该行。