【问题标题】:Socket.io android node.jsSocket.io 安卓 node.js
【发布时间】:2015-11-10 00:17:31
【问题描述】:

我正在尝试在 node.js 和 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");
   });

【问题讨论】:

  • 在你的代码中缩进,因为它很难阅读

标签: android node.js socket.io


【解决方案1】:

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

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

通过这个发射,您可以将您的消息 var 内容作为发送到套接字的名称。你应该做的是

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

在安卓中:

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

【讨论】:

  • 感谢您的帮助,它解决了我的主要问题,关于我的其他问题,您知道是否有办法将即将到来的消息存储在变量中?我想在服务器和客户端都这样做
  • 保存您收到的数据?
  • 是的,我想做类似 zona=socket.on("new message", onNewMessage);在 android 端,并且 id=data[0]; RSSI[0]=data[1] 等等,在 nodejs 端
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2013-07-19
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多