Java:通过套接字与多个本地客户端发送的数据不一致
Java: Inconsistent data sent over sockets with multiple local clients
我开发了一个有效的聊天服务器,可以承载任意数量的客户端连接。除了发送字符串之外,该服务器还可以接收和中继 2 个不同的 java 对象。除了将从一个客户端接收到的数据传播到所有其他客户端,服务器本身也可以发送数据。
我只有一台机器可以测试,所以测试变得很困难。对于单个客户端,一切都按预期进行。接下来我尝试了 2 个客户端。
为了方便所有三个应用程序 运行 在本地,服务器管理两个 ServerSocket,每个都在一个唯一的端口上。然后,这两个客户端中的每一个都绑定到一个唯一的 ServerSocket。请让我知道这是否不正确甚至不必要(单个 ServerSocket 是否适用于同一端口上的多个本地连接?我找不到这个问题的答案。)有 2 个客户端和服务器 运行 ,我开始看到问题。
只有最旧的客户端才能收到一种对象的更新版本,只有最新的客户端才能收到另一种对象的更新版本。所有客户端都会收到所有聊天消息。
为了中继消息,我遍历了 ObjectOutputStreams 的 ArrayList。我正在写入的数据对于所有流都是相同的,但是两个客户端接收到的数据不同。这个想法有什么明显的错误吗?还是我需要继续挖掘我的代码?
一个服务器套接字对大量连接很有用,但不能同时使用。
我不太了解您的软件,但您似乎想向所有客户端发送所有数据,但您正在向不同的客户端(或消费者)发送一个数据包。
确保您不会将数据发送给一个客户端而不是另一个客户端,而是发送给所有客户端。
一个问题与错误相关。但是,不,当这两个连接和服务器都存在于使用相同端口的同一台机器上时,不可能维护两个不同的套接字连接。
其次,多次执行以下操作似乎存在一些一致性问题:
private void sendObject(ObjectOutputStream output) {
try {
output.writeObject(object);
output.flush();
}catch (Exception e) {
e.printStackTrace();
}
return;
}
这种方法会导致客户端读取上次调用该函数时读取的同一对象。每次创建一个新对象发送似乎已经解决了这个问题。
private void sendObject(ObjectOutputStream output) {
try {
output.writeObject(object);
output.flush();
output.reset();
}catch (Exception e) {
e.printStackTrace();
}
return;
}
我开发了一个有效的聊天服务器,可以承载任意数量的客户端连接。除了发送字符串之外,该服务器还可以接收和中继 2 个不同的 java 对象。除了将从一个客户端接收到的数据传播到所有其他客户端,服务器本身也可以发送数据。
我只有一台机器可以测试,所以测试变得很困难。对于单个客户端,一切都按预期进行。接下来我尝试了 2 个客户端。
为了方便所有三个应用程序 运行 在本地,服务器管理两个 ServerSocket,每个都在一个唯一的端口上。然后,这两个客户端中的每一个都绑定到一个唯一的 ServerSocket。请让我知道这是否不正确甚至不必要(单个 ServerSocket 是否适用于同一端口上的多个本地连接?我找不到这个问题的答案。)有 2 个客户端和服务器 运行 ,我开始看到问题。
只有最旧的客户端才能收到一种对象的更新版本,只有最新的客户端才能收到另一种对象的更新版本。所有客户端都会收到所有聊天消息。
为了中继消息,我遍历了 ObjectOutputStreams 的 ArrayList。我正在写入的数据对于所有流都是相同的,但是两个客户端接收到的数据不同。这个想法有什么明显的错误吗?还是我需要继续挖掘我的代码?
一个服务器套接字对大量连接很有用,但不能同时使用。 我不太了解您的软件,但您似乎想向所有客户端发送所有数据,但您正在向不同的客户端(或消费者)发送一个数据包。
确保您不会将数据发送给一个客户端而不是另一个客户端,而是发送给所有客户端。
一个问题与错误相关。但是,不,当这两个连接和服务器都存在于使用相同端口的同一台机器上时,不可能维护两个不同的套接字连接。
其次,多次执行以下操作似乎存在一些一致性问题:
private void sendObject(ObjectOutputStream output) {
try {
output.writeObject(object);
output.flush();
}catch (Exception e) {
e.printStackTrace();
}
return;
}
这种方法会导致客户端读取上次调用该函数时读取的同一对象。每次创建一个新对象发送似乎已经解决了这个问题。
private void sendObject(ObjectOutputStream output) {
try {
output.writeObject(object);
output.flush();
output.reset();
}catch (Exception e) {
e.printStackTrace();
}
return;
}