Jeromq / ZeroMQ服务器(windows) - 客户端(android)测试

时间:2015-07-03 12:17:18

标签: java android sockets zeromq jeromq

我尝试使用一个简单的应用程序与Jeromq库进行测试,但该工作无效。

此处的服务器:

import org.zeromq.ZMQ;

public interface ConnectionReadyListnener {

        void onServerConnectionEstablished();

}

所以,在启动之后我有一个Log - " Started"。 192.168.56.1是我的本地IP地址和netstat -na(我在Windows上工作)向我显示192.168.56.1:5570正在收听。所以,我猜它没关系。我在Windows中打开了这个套接字。

然后在android上我写了这个:

建立连接的接口:

public class Connection extends AsyncTask<Void, Void, Void> {

    public ConnectionReadyListnener listener=null;
    public static ZMQ.Context context;
    public static ZMQ.Socket socket;


    @Override
    protected Void doInBackground(Void... params) {

        context = ZMQ.context(1);
        socket = context.socket(ZMQ.DEALER);
        socket.setIdentity("12345".getBytes(ZMQ.CHARSET));
        socket.connect("tcp://192.168.56.1:5570"); 

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        listener.onServerConnectionEstablished();
    }

}

然后Connection AsyckTask建立与服务器的连接:

public class MainActivity extends Activity implements ConnectionReadyListnener{
    Connection connection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        connection = new Connection();
        connection.listener=this;
        connection.execute();
    }

    @Override
    public void onServerConnectionEstablished() {
        Toast.makeText(getApplicationContext(), "connected", Toast.LENGTH_SHORT).show();
        new TestAsynk().execute();

    }


}

和MainActivity在建立连接时启动测试任务:

public class TestAsynk extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... params) {
        Connection.socket.send("Test".getBytes(), 0);
        return null;
    }

}

这是TestAsynk类发送服务器应该收到的测试消息并登录到控制台:

 private void TxtName_Tapped(object sender, TappedRoutedEventArgs e)
    {
        clickedElementName = ((TextBlock)sender).Name ;
        if(clickedElementName == "element1")
        {
        }
    }

但它从未记录结果 - 它没有收到它。问题是我不知道为什么 - 电话(真实设备)和带服务器的电脑都在一个WiFi网络中。而且我也了解到ZeroMQ无法确定连接是否真正建立。

请帮我搞清楚。

1 个答案:

答案 0 :(得分:0)

这里有很多问题。

1)永远不要在线程之间传递套接字。 ZeroMQ中唯一的线程安全对象是Context。在线程之间传递套接字几乎肯定是问题的根源。

2)如果您在服务器端遇到问题,可能是IP地址不正确。如果可能的话,我不建议硬编码绑定一侧的IP地址。只需使用通配符&#34; *&#34;代替。所以在服务器端,它看起来像

    socket.bind("tcp://*:5570");

3)你的异步模式有一个明显的错误......如果在监听器设置为Activity之前onPostExecute运行会怎么样?至少,在你的AsyncTask中添加一个构造函数,它接受Activity ......就像

public Connection(Activity listener){
    this.listener = listener;
}

4)检查权限。在过去,我需要INTERNET和ACCESS_WIFI_STATE权限。