Android客户端没有收到来自node.js服务器的socket.io消息

我已经使用socket.io将Android客户端连接到node.js服务器,并且能够将消息发送到服务器,但不能在客户端上接收。 对于客户端我喜欢

Log.i("MainActivity: ", "sending message"); final JSONObject sdpObj = new JSONObject(); try { sdpObj.put("id","presenter"); sdpObj.put("sdpOffer",localSdpOffer.description); } catch (JSONException e) { e.printStackTrace(); } LoginActivity.mSocket.emit("new message", sdpObj); 

并在服务器上收到对象如:

  io.sockets.on('connection',function(socket){ socket.on('new message',function(message){ // some logic socket.emit('created',object); 

那么在客户端:

  LoginActivity.mSocket.on("created", new Emitter.Listener() { @Override public void call(Object... args) { Log.i( TAG, "message back:received "); User user = new User(); JSONObject obj = null; try { obj = new JSONObject((String) args[0]); //Log.i(TAG,"SdpAnswer: "+args[0].sdpAnswer+"id "+obj.sdpAnswer); Log.i(TAG, "Instance of"+args[0].toString()); } }); } 

但由于某种原因,它永远不会收到消息。 任何人有一些想法,为什么这可能是? 谢谢!

如果按照文档使用nkzawa的socket.io库,则必须使用runonUIThread方法处理调用方法的内部结构。

 import com.github.nkzawa.emitter.Emitter; private Emitter.Listener onNewMessage = new Emitter.Listener() { @Override public void call(final Object.. args) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { JSONObject data = (JSONObject) args[0]; String username; String message; try { username = data.getString("username"); message = data.getString("message"); } catch (JSONException e) { return; } // add the message to view addMessage(username, message); } }); } }; 

这就是onNewMessage的样子。 监听器是Emitter.Listener的一个实例,必须实现调用方法。 您会注意到,call()内部被Activity#runOnUiThread()包装,这是因为callback总是在Android UI线程的另一个线程上调用,所以我们必须确保添加一个消息来查看UI线程。

有关更多信息,请参阅此链接: Native Socket.IO和Android

好,所以我想了一些更多的search后。 看起来,为了正确维护不同的android活动的套接字连接,我不得不实现一个单例类,在那里我定义了套接字连接。问题是,我在一个活动中实例化套接字连接,并试图在另一个活动上使用该连接即使我可以发送消息在另一个活动,我不能接收任何东西,除非我把套接字移动到收到消息的地方。 你可以find很多关于如何实现一个单例类的例子,所以它不难,它解决了我的问题。 祝你今天愉快 :)