scala - 经销商(服务器)到经销商( worker )不工作

标签 scala zeromq

在以下DEALERDEALER连接, worker DEALER发送 [][Foo!] ,即一个 2 帧的消息,到服务器 DEALER .

package net.async

import org.zeromq.ZMQ
import org.zeromq.ZMQ.Socket

class Worker(name: String) extends Runnable {

  import DealerToDealer._

  val WorkerResponse = "Foo!".getBytes

  val id = name.getBytes

  override def run(): Unit = {
    val context = ZMQ.context(1)
    val worker = context.socket(ZMQ.DEALER)
    worker.setIdentity(id)
    worker.connect(s"tcp://localhost:$Port")
    runHelper(worker)
  }

  private def runHelper(worker: Socket): Unit = {
    println(s"Worker ${name}: sending Empty + ${show(WorkerResponse)}.")
    worker.send(Empty, ZMQ.SNDMORE)
    worker.send(WorkerResponse, 0)
    println(s"Worker ${name}: sent")
    val message = show(worker.recv(0))
    println(s"Worker ${show(worker.getIdentity)}: received message: $message.")
    runHelper(worker)
  }
}

object DealerToDealer {

  def show(xs: Array[Byte]): String =
    new String(xs)

  val Port = 5555

  val Empty = "".getBytes

  val WorkerMessage = "Bar!".getBytes
  val WorkLimit = 25

  def main(xs: Array[String]): Unit = {
    val context = ZMQ.context(1)
    val server = context.socket(ZMQ.DEALER)
    new Thread(new Worker("Bob")).run()
    server.bind(s"tcp://*:$Port")
    runHelper(server, 0)
  }

  private def runHelper(server: Socket, sent: Int): Unit = {
    if (sent > WorkLimit ) {
      println(s"SERVER: sent the '$WorkerMessage' message ${WorkLimit} times. shutting down.")
      sys.exit(0)
    }
    else {
      println(s"SERVER: sending Empty + ${show(WorkerMessage)}.")
      server.send(Empty, ZMQ.SNDMORE)
      server.send(WorkerMessage, 0)
      println(s"SERVER: sent")
      val message = server.recv(0)
      println(s"SERVER: received message: ${show(message)}.")
      runHelper(server, sent + 1)
    }
  }
}

但是,在运行它时,只有打印语句显示了 Worker 消息的发送。未显示服务器的实际收据
[info] Running net.async.DealerToDealer
[info] Worker Bob: sending Empty + Foo!.
[info] Worker Bob: sent

为什么Server收到这条消息?

另外,是 [][Message] DEALER 格式正确至 DEALER沟通?

最佳答案

是的 [][message] 的格式是正确的,但请记住,您需要阅读(所有内容)空框架,然后阅读您的消息。

关于scala - 经销商(服务器)到经销商( worker )不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38948235/

相关文章:

list - 用语义上等效的猫功能替换 scalaz ListT

zeromq - ZMQ_DEALER 套接字负载平衡,受 bind() 或 connect() 影响的故障转移行为

zeromq - Zeromq 是否保证发送方/接收方崩溃后的交付?

scala - Redis 队列排序错误

scala - IO monad 如何使 Scala 中的并发变得容易?

java - 如何限制使用 Scala 显示的字符串中的字符数

scala - 使用 Shapeless 展平包含 case 类元素的任意嵌套元组

ZeroMQ 和本地 FIFO

java - import org.zeromq 无法解析,我该怎么办?

c++ - ZMQ 在 Publisher Socket 上产生 EAGAIN