我尝试使用zeromq在android中实现一个简单的发布者和订阅者。当我尝试在订阅者recv中调试它循环。我不知道我哪里错了。我认为它无法从发布者那里获得任何数据。
以下是代码:订阅者
package com.example.jeromqps;
import java.util.*;
import org.jeromq.ZMQ;
import android.os.AsyncTask;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
public class client implements Runnable {
Messenger messenger;
public client()
{
System.out.println("client started");
}
@Override
public void run()
{
ZMQ.Context context=ZMQ.context(1);
System.out.println("collecting data from server");
ZMQ.Socket subscriber=context.socket(ZMQ.SUB);
subscriber.connect("tcp://localhost:4444");
String code="10001";
subscriber.subscribe(code.getBytes());
int totalvalue=0;
//store the data in a data structure
for(int i=0;i<10;i++)
{
byte[] msg = subscriber.recv(0);
String string=new String(subscriber.recv(0));
StringTokenizer sscanf=new StringTokenizer(string," ");
int value=Integer.valueOf(sscanf.nextToken());
String string= new String(msg);
System.out.println();
totalvalue+=value;
}
int avg=totalvalue;
Message msg1=Message.obtain();
msg1.obj=string;
try {
messenger.send(msg1);
System.out.println("sent to main");
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
subscriber.close();
context.term();
}
}
发布商代码位于
之下 package com.example.jeromqps;
import java.util.*;
import org.jeromq.*;
public class server implements Runnable{
public server()
{
System.out.println("server started");
}
@Override
public void run()
{
ZMQ.Context context=ZMQ.context(1);
ZMQ.Socket publisher=context.socket(ZMQ.PUB);
publisher.bind("tcp://*:4444");
Random srandom=new Random(System.currentTimeMillis());
System.out.println("in server");
while(!Thread.currentThread().isInterrupted())
{ //System.out.println("in while")
int zipcode =1000 +srandom.nextInt(10000);
int temperature = srandom.nextInt(215) - 80 + 1;
String update = String.format("%05d %d", zipcode, temperature);
String update="publisher";
publisher.send(update.getBytes(),0);
}
publisher.close();
context.term();
}
}
主要在下面:
package com.example.jeromqps;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.os.Handler;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends Activity implements Handler.Callback {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new server()).start();
new Thread(new client()).start();
}
@Override
public boolean handleMessage(Message arg0)
{
String str = new String((byte[]) arg0.obj);
System.out.println("****");
System.out.println(str);
//new AlertDialog.Builder(this).setMessage(str).show();
System.out.println("****");
textView.append(str+ "\n");
return false;
}
}
在byte []的程序循环中,msg = subscriber.recv(0);在订阅者类中。我哪里错了?我错过了什么吗?
答案 0 :(得分:0)
首先,您在代码中遇到了一些错误:
在发布商中,update
定义了两次
String update = String.format("%05d %d", zipcode, temperature);
String update= "publisher";
您在订阅者代码中遇到类似问题,string
定义了两次......
String string = new String(subscriber.recv(0));
String string = new String(msg);
在订阅者中,您在同一次迭代中收到两次消息..
byte[] msg = subscriber.recv(0);
String string = new String(subscriber.recv(0));
...你只需要在循环中接收这个......
String string = new String(subscriber.recv(0));
尝试解决这些问题,看看你能走多远......
答案 1 :(得分:0)
这不是解决此处发布的问题的解决方案,但是在阅读此问题时,我注意到0
已被指定为send(...)
方法中的第二个参数,该参数随后与recv(...)
方法。
我设置了一个简单的发布/订阅系统,但无法确定发送消息的原因。我正在使用recv(0)
,但在send(...)
方法中指定了一些随机标记。将值更改为0
修复了我的问题。
想象我在这里发布这个,因为它是通过阅读我碰巧想到的问题中的代码来实现的。所以也许这将有助于其他人。