2016-12-07 145 views
2

我已经使用socket.io将Android客户端连接到了node.js服务器,并且我能够将消息发送到服务器,但不能在客户端上接收。 对于客户端我做的财产以后像Android客户端没有收到来自node.js服务器的socket.io消息

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

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

回答

0

OK,所以我想通了之后,更多的一些搜索。看来,为了正确维护不同的android活动的套接字连接,我不得不实现一个单例类,在那里我定义了套接字连接。问题是我在一个活动中实例化了套接字连接并试图在另一个活动上使用该连接即使我可以在另一个活动上发送消息,我也无法收到任何消息,除非我将套接字移到收到消息的活动中。你可以找到很多关于如何实现单例类的例子,所以它不会很难,它解决了我的问题。祝你有美好的一天:)

2

如果按照文档使用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()包装,这是因为回调始终在Android UI线程的另一个线程上调用,因此我们必须确保添加消息以查看UI线程。

请参阅此链接了解更多信息: Native Socket.IO and Android

+0

我不同意在上面的示例runOnUiThread是必需的。没有任何操纵任何观点。在我看来,这就是为什么在Socket.IO站点示例中需要这个原因。 – SiMet