gpt4 book ai didi

java - 当两个客户端向服务器发送对象时,ObjectOutputStream writeObject 挂起

转载 作者:可可西里 更新时间:2023-11-01 02:55:12 25 4
gpt4 key购买 nike

我正在编写客户端/服务器应用程序,其中多个客户端连接到服务器并通过 TCP 连接以高速率连续向服务器发送序列化对象。

我在客户端使用 ObjectOutputStream.writeObject,在服务器端使用 ObjectInputStream.readObject。

服务器应用程序使用 serverSocket.accept() 在单个端口上接受客户端连接,并将 Socket 传递给新线程以读取对象。

当单个客户端连接并发送大约 25K 个对象/秒时 - 一切正常。一旦我启动第二个客户端,在很短的时间后,一个或两个客户端卡在其中一个服务器的 ObjectOutputStream.writeObject 上,相应的服务器卡在 ObjectInputStream.readObject 上。双方都没有抛出异常。

如果速率非常低,假设总共为 10-20/s - 它不会挂起,但在 100-1000/s 时它会挂起。

在客户端机器上使用netstat -an我可以看到相应链接的send-Q大约是30K。在服务器端,receive-Q 也是 ~30K。

在本地 Windows 上运行客户端/服务器时,我观察到类似的情况 - 客户端挂起,但服务器继续处理传入的对象,一旦 catch ,客户端解锁并继续发送对象。

本地在 windows 上,服务器比客户端慢,但在 linux 上,运行在不同机器上的服务器实例的数量足以满足客户端产生的速度。

有什么线索吗?

客户端代码片段:

Socket socket = new Socket(address, port);
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
while(true)
{
IMessage msg = createMsg();
outputStream.writeObject(msg);
outputStream.flush();
outputStream.reset();
}

接受连接的服务器代码:

while(active)
{
Socket socket = serverSocket.accept();
SocketThread socketThread = new SocketThread(socket);
socketThread.setDaemon(true);
socketThread.start();
}

服务器代码读取对象:

public class SocketThread extends Thread 
{
Socket socket;
public SocketThread(Socket socket)
{
this.socket = socket;
}

@Override
public void run() {
try {
ObjectInputStream inStream = new ObjectInputStream(socket.getInputStream());
while(true)
{
IMessage msg = (IMessage)inStream.readObject();
if(msg == null){
continue;
}
List<IMessageHandler> handlers = handlersMap.get(msg.getClass());
for(IMessageHandler handler : handlers){
handler.onMessage(msg);
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}

最佳答案

您刚刚描述了当发送方超过接收方时 TCP 的操作。接收方告诉发送方停止发送,因此发送方停止发送。当您使用阻塞 I/O 时,客户端会在内部阻塞 send()

这里没有问题需要解决。

关于java - 当两个客户端向服务器发送对象时,ObjectOutputStream writeObject 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37868421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com