Socket.io android node.js

Socket.io android node.js

我正在尝试在 node.js 和 android 之间创建一个基本的聊天应用程序,当我 运行 服务器和客户端我可以在日志中看到他们连接和我的android 应用程序发送消息但服务器从未收到,我的android代码是:

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

    }

}

我还想让传入的消息(总是数字)存储在名为 zona 的变量中。

我的服务器端代码是:

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

您正在侦听从未触发的某些事件。

在服务器上,您正在等待名称为 "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);

使用此 emit,您将消息 var content 作为发送到套接字的名称。你应该做的是

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

这样您的服务器将接收套接字"new-message"并进入您的函数。

对于检索数据,您可能会发现在这两种情况下都将其作为 JSONObject 发送很有用,因为在 Android 中您发送的是用 ; 分隔元素的字符串,这意味着操作该字符串以获得每个值收到时

在节点中:

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