2015-07-03 55 views
1

我想用一个简单的应用程序不工作与Jeromq库测试。Jeromq/ZeroMQ服务器(Windows) - 客户端(安卓)测试

这里的服务器:

进口org.zeromq.ZMQ;

public class Server { 

    public static void main(String[] args) throws Exception { 

      ZMQ.Context ctx = ZMQ.context(1); 

      ZMQ.Socket socket = ctx.socket(ZMQ.REP); 
      socket.bind("tcp://192.168.56.1:5570"); 
      System.out.println("Started"); 

      while (!Thread.currentThread().isInterrupted()) { 

       byte[] request = socket.recv(0); 
       String string = new String(request); 
       System.out.println("Received request: ["+string+"]."); 

       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       socket.send("We got message".getBytes(), 0); 
      } 

      System.out.println("finished"); 
      socket.close(); 
      ctx.term();   
    } 
} 

所以,启动后,我有一个日志 - “开始”。 192.168.56.1是我的本地IP地址,netstat -na(我在Windows上工作)显示我192.168.56.1:5570是Listening。所以,我想没关系。我在Windows中打开此套接字。

然后在Android上我写了这个:

接口连接建立:

public interface ConnectionReadyListnener { 

     void onServerConnectionEstablished(); 

} 

然后连接AsyckTask建立连接到其中的服务器:

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

} 

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

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

    } 


} 

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

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

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

} 

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

请帮我弄明白。

+0

您是否找到解决此问题的解决方案?在过去两天里,我一直坚持这一点,并没有得到谷歌的帮助。 – Ashok

+0

@Ashok对不起,我没有,并退出尝试ZMQ。另外,测试显示websockets比zmq – user2976267

+0

还好。无论如何感谢您的回应。看来我的一位同事已经成功地做到了这一点。如果是的话,会在这里更新 – Ashok

回答

0

这里有很多问题。

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

2)如果您在服务器端有问题,可能是IP地址不正确。如果可能的话,我不会推荐硬编码绑定侧的IP地址。只需使用通配符“*”。因此,在服务器端,它看起来像

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

3)你的异步模式有一个明显的错误......会发生什么,如果onPostExecute跑前监听器设置为活动?最起码,一个构造函数添加到您的AsyncTask这需要在活动...像

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

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