2015-11-05 104 views
0

我想創建一個node.js和android之間的基本聊天應用程序,當我運行服務器和客戶端時,我可以在日誌中看到他們連接和我的android應用程序發送消息但服務器永遠不會收到它,我andoid代碼:Socket.io android node.js

private Socket socket; 
{ 
    IO.Options opts = new IO.Options(); 
    opts.forceNew = true; 
    opts.reconnection = true; 
    try { 
     socket = IO.socket("http://192.168.3.7:100"); 
    } catch (URISyntaxException e) { 
     Log.e("abc", "index=" + e); 
    } 
} 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_promociones); 
    socket.on("new message", onNewMessage); 
    socket.connect(); 
} 
    class WifiScanReceiver extends BroadcastReceiver { 
    @SuppressLint("UseValueOf") 
    public void onReceive(Context c, Intent intent) { 

     ObjWifi.startScan(); 
     messages =String.valueOf(id)+';'+ Arrays.toString(ret)+';'+String.valueOf(zona); 
     socket.emit(messages); 
     String str; 
     int i1 = r.nextInt(4 - 1) + 1; 
     if (zona == 0) { 
      str = "img_" + 4; 
     } else { 
      str = "img_" + zona + "_" + i1; 
     } 

     fondo.setImageDrawable(getResources().getDrawable(getResourceID(str, "drawable", getApplicationContext()))); 

    } 

} 

此外,我想使傳入消息(百達數)被存儲在一個稱爲透明變量。

我的服務器端代碼:

var express = require('express'); 
    var app = express(); 
    var server = require('http').Server(app); 
    var io = require('socket.io')(server); 
    var messages = [{ 
    text: "Hola soy un mensaje", 
    author: "Daniel" 
    }]; 
    app.use(express.static('public')); 
    io.on('connection', function(socket) { 
    var currentdate = new Date(); 
    var datetime = currentdate.getDate() + "/" 
      + (currentdate.getMonth()+1) + "/" 
      + currentdate.getFullYear() + " @ " 
      + currentdate.getHours() + ":" 
      + currentdate.getMinutes() + ":" 
      + currentdate.getSeconds(); 
    console.log('Alguien se ha conectado con Sockets',datetime); 
    socket.emit('messages', messages); 
    socket.on('disconnect',function(){ 
    console.log('Alguien se ha desconectado',datetime); 
    }); 
    socket.on('new-message', function(data) { 
    messages.push(data); 
    io.sockets.emit('messages', messages); 
    }); 
    }); 
    server.listen(100, function() { 
    console.log("Servidor corriendo en http://localhost:100"); 
    }); 
+0

使壓痕,becaouse它是很難讀 –

回答

0

您現在收聽的是永遠不會觸發某些事件。

在服務器上,您正在等待名爲「new-message」的套接字來觸發您的功能。

socket.on('new-message', function(data) { 
    messages.push(data); 
    io.sockets.emit('messages', messages); 
}); 

這將在用這些名稱中的一個名稱進行發射後觸發。相反,你的Android應用程序將執行以下操作:

messages =String.valueOf(id)+';'+ Arrays.toString(ret)+';'+String.valueOf(zona); 
    socket.emit(messages); 

有了這個發出你正在你的郵件變種內容發送到插座的名稱。你應該做的是

socket.emit("new-message", messages); 

這樣,你的服務器將收到插座「新信息」,並會在你的函數輸入。

對於檢索數據,在這兩種情況下,您都可能發現將它作爲JSONObject發送是有用的,就像在Android中發送String分隔元素一樣;意味着在接收時操作該字符串以獲取每個值。

在節點:

socket.on('new-message', function (data) { 
     id = data.id; 
     RSSI[0] = data.rssi; 
     zona = data.zona; 
    }); 

在Android中:

onNewMessage = new Emitter.Listener() { 
        @Override 
        public void call(final Object... args) { 
         //args[i] is the data received 
         String data = args[0].toString(); 
         try{ 
          JSONObject dataJSON = new JSONObject(data); 
          zona = dataJSON.get("zona"); 
         }catch(JSONException e){ 
          e.printStackTrace(); 
         } 
        } 
       }; 
在你的代碼
+0

感謝您的幫助,它solvced我的主要問題,關於我的其他問題,你知道是否有方法將即將到來的消息存儲在變量中?我想在服務器端和客戶端都做到這一點 –

+0

保存您收到的數據? –

+0

是的,我想要做一些像zona = socket.on(「new message」,onNewMessage);在android端,id = data [0]; RSSI [0] = data [1]等,在nodejs端 –