Scala 经销商路由器设置中的路由器挂起

Scala 经销商路由器设置中的路由器挂起,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
经销商
连接到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
的阻塞,你是对的。我需要在
新线程(新客户端(…)
调用之后移动该行。