問題描述:socket
在以前的例子中咱們沒有使用特別的TOPIC來區分,此次咱們對發佈的消息進行TOPIC區分,可是發現這個TOPIC不能存在一個類似度,看以下代碼:tcp
package com.guo.server;
import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;
public class Publisher {
public void start(){
System.out.println("===========publisher start=============");
Context context = ZMQ.context(1);
Socket socket = context.socket(ZMQ.PUB);
socket.setLinger(5000);
socket.setSndHWM(0);
socket.bind("tcp://192.168.124.130:6666");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
for(int i=0;i<10;i++){
String pubstr ="WORK task"+i;
socket.sendMore("NEWS");
socket.send(pubstr);
socket.sendMore("NEWSONE");
socket.send("can not receive");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
socket.send("END", 0);
System.out.println("===========publisher end=============");
socket.close();
context.term();
}
}
這裏發佈了2個TOPIC,然而訂閱端作了一個訂閱ide
package com.guo.client;
import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;
public class Subscriber {
public void start(){
System.out.println("===========subscriber start=============");
Context context = ZMQ.context(1);
Socket socket = context.socket(ZMQ.SUB);
socket.connect("tcp://192.168.124.130:6666");
socket.subscribe("NEWS".getBytes());
while(true){
byte[] top =socket.recv(0);
String topStr = new String(top);
byte[] res =socket.recv(0);
String resStr = new String(res);
System.out.println("substring is ="+topStr+" "+resStr);
if("END".equalsIgnoreCase(resStr)){
break;
}
}
System.out.println("===========subscriber end=============");
socket.close();
context.term();
}
}
結果是兩個主題都有消息接收。若是將發佈的代碼調整爲:測試
socket.sendMore("NEWS");
socket.send(pubstr);
socket.sendMore("ONE");server
這樣訂閱端能夠正常使用。經測試我的認爲這是使用正則形成的一個小的BUG,問題待往後求證。get
這裏若是發佈端採用單一的發送方式:socket.send(pubstr);則在訂閱端咱們能夠經過訂閱WORK主題來獲得完整的消息:socket.subscribe("WORK".getBytes());byte[] res =socket.recv(0);若是這裏的訂閱主題換成其餘的則是得不到消息的。string
上述代碼結束有點問題,請忽略一下。
it