2016-08-09 8 views
1

den folgenden Versuch gegeben zu verbinden 1 DEALER-1 ROUTER:Router Hängen in Dealer-Router-Setup

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() 
    } 
} 

Ich sehe die folgende Ausgabe, auf der zweiten Nachricht hängen.

[info] Running net.async.AsyncClientServer 
[info] Waiting to receive messages from Dealer. 

Warum ist das?

+0

@drozzy - Sie hatten recht mit 'mainHelper's Blockierung. Ich musste diese Zeile ** nach dem Aufruf des neuen Threads (neuer Client (...)) verschieben. –

Antwort

1

Nicht sicher, ob es die Ursache Ihres Problems ist, aber Sie müssen nicht den Identitätsrahmen von Ihrem Händler senden, zeromq wird dies für Sie tun. Indem Sie es hinzufügen, senden Sie eine 4-teilige Nachricht.

IDENTITY 
IDENTITY 
EMPTY 
CONTENT 
+0

Es wird die Identität und den leeren Chip an den Händler-Sender oder Router-Empfänger hängen? –

+0

Eigentlich antwortete, wenn halb im Schlaf schlecht war. Der Händler muss den leeren Rahmen (und alle vorherigen Routing-Informationen, die es hatte, nichts in Ihrem Fall) anhängen, aber nicht seine eigene Identität. Dies wird vom Router-Socket hinzugefügt, der die Nachricht empfängt. – David

+0

Aber der 'ROUTER' muss, wenn er mit dem' HÄNDLER' spricht, eine 3-Frame-Nachricht senden: '[IDENTITY] [EMPTY] [MESSAGE]' ?. Auch - bitte, um deine Antwort zu bearbeiten, bitte? –