【问题标题】:Socket.io java client get same message more than one timeSocket.io java客户端多次收到相同的消息
【发布时间】:2016-05-10 13:34:54
【问题描述】:

我在我的 android 聊天应用程序上使用 socket.io。为了保持连接有效,我在主要活动中启动的服务中连接套接字。我检查套接字是否已连接。如果不是,我进行套接字连接。这是我的代码:

try {
        mSocket = IO.socket("http://192.168.x.x:XXXX");
    } catch (URISyntaxException e) {
        throw new RuntimeException(e);
    }

    if(!mSocket.connected()){   
        mSocket.connect();
    }

    mSocket.on("new message", onNewMessage);
    mSocket.on("user joined", onUserJoined);
    mSocket.emit("add user", "MobileUser");

    message += cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE);
    sendMessage();

public void sendMessage(){
     mSocket.emit("new message", message);
     addMessage("MobileUser", message);
}

连接工作完美。我的服务每分钟使用套接字发送消息。在其他客户端中看起来像这样:

MobileUser: 1:11
MobileUser: 1:12
MobileUser: 1:13
MobileUser: 1:14
MobileUser: 1:15

这是我的问题:在这 5 条消息之后(5 次只是一个例子,它可以是大于 1 的任何数字),如果其他客户端发送消息,我会收到 5 条消息次。但我当然想一次性收到这条消息。我该如何处理这个问题?有什么建议吗?

编辑:

我的 onNewMessage 方法在客户端:

private Emitter.Listener onNewMessage = new Emitter.Listener() {
public void call(final Object... args) {
    Thread t = new Thread(new Runnable() {
        public void run() {
            JSONObject data = (JSONObject) args[0];
            try {
                username = data.getString("username");
                message = data.getString("message");
            } catch (JSONException e) {
                return;
            }

            Log.v(username, message);
        }
    });

    t.start();
  }
};

还有我服务器上的“新消息”事件:

socket.on('new message', function (data) {
   console.log('message: ' + data);

   socket.broadcast.emit('new message', {
      username: socket.username,
      message: data
   });
});

【问题讨论】:

  • 你在 onNewMessage 方法中做了什么?看来您正在收听并在服务器中发出“新消息”事件,这可能是问题
  • 是的,你是对的。我将通过添加 onNewMessage 方法来编辑我的问题。 @risuch
  • 到目前为止,看起来没有任何问题,但还不清楚您的客户端-服务器应用程序中涉及的所有部分,因此很难详细说明。您可能想要上传一些 plunker 或以便显示完整信息。看来你的服务器是node.js和Client Java,对吧?所有Client都使用相同的代码,连接到同一个服务器?
  • 是的,我的服务器是 node.js。实际上,当我使用这个项目(github.com/nkzawa/socket.io-android-chat.git)作为客户时,我没有遇到这个问题。但正如我之前提到的,我想在服务中使用 socket.io 以保持连接处于活动状态。 @risuch

标签: java android socket.io client


【解决方案1】:

我想我找到了解决方案。我应该检查我的服务类中是否连接了套接字,但这些代码不应该在那里:

mSocket.on("new message", onNewMessage);
mSocket.on("user joined", onUserJoined);
mSocket.emit("add user", "MobileUser");

我从我的服务类中删除了这些并放入 MainActivity 类。问题解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2021-05-23
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多