【发布时间】:2016-11-26 18:55:18
【问题描述】:
这是我的客户端/服务器的流程。
在主线程中创建套接字。
- 套接字传递到线程 1。
- 客户端向服务器发送数据
- 服务器响应客户端
- 服务器通过调用
close()关闭输入流、输出流和套接字 - Socket 返回主线程,然后传递给线程 2。
- 客户端将数据写入服务器 - 无异常,无错误,服务器未获取数据
- 客户端尝试读取数据 - 没有异常,没有错误
如何检测socket被关闭的问题?
try {
os = new DataOutputStream(this.socket.getOutputStream());
os.write(data);
os.flush();
System.out.println("Written " + data.length + " bytes");
} catch (IOException e) {
System.out.println("Client failed to write to stream");
System.out.println(e.getMessage());
e.printStackTrace();
}
永远不会抛出异常。它说Written 60 bytes。有什么想法吗?
更新
这是我阅读回复的方式。我等待数据,读取前 4 个字节(给出响应的长度),然后继续读取,直到我读取到指定的长度。这个循环永远不会结束,因为没有数据进入。
is = new DataInputStream(this.socket.getInputStream());
while(true){
while(is.available() > 0){
bos.write(is.read());
}
if(contentLength == 0 && bos.size() > 3){
byte[] bytes = bos.toByteArray();
byte[] size = Arrays.copyOf(bytes, 4);
contentLength = ByteBuffer.wrap(size).getInt();
}
if(bos.size() - 4 < contentLength){
continue;
}
break;
}
【问题讨论】:
-
你检查过 SocketException 吗?如果您要关闭所有内容,那么它也应该抛出它。
-
是的,没有抛出异常。我用有关线程之间传递的套接字的其他信息更新了问题
-
你可以从一个封闭的流中读取多少字节而不阻塞?没有。所以
available()必须返回零。 -
您没有写入已关闭的输出流。您正在写入可能已被对等方关闭的连接。这不是一回事。
标签: java sockets outputstream