2016-12-07 271 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

相關問題