gpt4 book ai didi

java - 奇怪的 Java 套接字行为(连接,但不发送)

转载 作者:行者123 更新时间:2023-12-02 08:32:44 25 4
gpt4 key购买 nike

我有一个相当复杂的项目,可以归结为通过对象流进行通信的简单客户端/服务器。

对于两个连续连接,一切都完美无缺(我连接一次,工作,断开连接,然后再次连接,工作,然后断开连接)。客户端连接,执行其业务,然后关闭。服务器成功关闭对象输出流和套接字,没有 IO 错误。

当我第三次尝试连接时,连接似乎已成功通过(ServerSocket.accept() 方法成功并成功创建了 ObjectOutputStream)。然而,没有数据被传递。 inputStream.readUnshared() 方法只是阻塞。

我已采取以下内存预防措施:

  1. 当需要关闭套接字时,所有正在运行的线程都会停止,并且所有对象都会被清空。
  2. 在每个 writeUnshared() 方法之后调用时,ObjectOutputBuffer 是刷新并重置。

有没有人遇到过类似的问题,或者有什么建议吗?恐怕我的项目相当大,因此复制代码是有问题的。

该项目归结为:

服务器主

ServerSocket serverSocket = new ServerSocket(port);

while (true) {
new WorkThread(serverSocket.accept()).start();
}

工作线程(服务器)

public void run() {
ObjectInputBuffer inputBuffer = new ObjectInputBuffer(new BufferedInputStream(socket.getInputStream()));

while (running) {
try {
Object myObject = inputBuffer.readUnshared();

// do work is not specified in this sample
doWork(myObject);
} catch (IOException e) {
running = false;
}
}

try {
inputBuffer.close();
socket.close();
} catch (Exception e) {
System.out.println("Could not close.");
}
}

客户端

public Client() {
Object myObject;
Socket mySocket = new Socket(address, port);

try {
ObjectOutputBuffer output = new ObjectOutputBuffer(new BufferedOutputStream(mySocket.getOutputStream()));

output.reset();
output.flush();
} catch (Exception e) {
System.out.println("Could not get an input.");
mySocket.close();
return;
}

// get object data is not specified in this sample. it simply returns a serializable object
myObject = getObjectData();

while (myObject != null) {
try {
output.writeUnshared(myObject);
output.reset();
output.flush();
} catch (Exception e) {
e.printStackTrace();
break;
} // catch
} // while

try {
output.close();
socket.close();
} catch (Exception e) {
System.out.println("Could not close.");
}
}

感谢所有能够提供帮助的人!

最佳答案

(1)什么是ObjectInputBuffer和ObjectOutputBuffer?您是指 ObjectInputStream 和 ObjectOutputStream 吗?

(2) 如果是这样,在创建 ObjectOutputStream 后立即调用 Reset() 只会浪费时间和带宽。

(3) 为什么在创建输出流时出现异常时打印“无法获取输入”?

(4) 当您遇到异常时,您应该始终打印其消息 - 不要完全用您自己的消息替换它,那只会丢弃有用的信息。

(5) 您假设读取时任何 IOException 都意味着流的结束。只有 EOFException 意味着这一点。应打印或记录任何其他 IOException。显然,您在这里遇到了一些其他异常并忽略了它。

(6) 为什么你总是发送同一个对象?

关于java - 奇怪的 Java 套接字行为(连接,但不发送),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2885591/

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