java - Socket.io java 客户端多次收到相同的消息

标签 java android socket.io client

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

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

最佳答案

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

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

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

关于java - Socket.io java 客户端多次收到相同的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37140167/

相关文章:

java - 如何配置log4j 2's additivity to respect parent' s级别?

java - Java中打开带参数的exe,不懂参数

android - 真正简单的TCP客户端

javascript - 如何知道何时使用 socket.io 订阅/取消订阅 channel

python - 如何从websocket端点外部发出websocket消息?

java - 如何在 Java 中打印一个已经格式化的字符串

java - 立即将 Spark 中的 Json 字符串索引到 Elasticsearch

android - 我应该在 Android 中的什么地方存储信用卡号?

java - 必须声明为抽象或实现抽象方法

namespaces - socket.io 中的命名空间将不起作用