Java写入关闭的输出流而不是抛出ioexception

5 java sockets outputstream

这是我的客户端/服务器的流程.

套接字在主线程中创建.

  1. 套接字传递给线程1.
  2. 客户端向服务器发送数据
  3. 服务器响应客户端
  4. 服务器通过调用关闭输入流,输出流和套接字 close()
  5. 套接字返回主线程,然后传递给线程2.
  6. 客户端将数据写入服务器 - 没有例外,没有错误,服务器没有数据
  7. 客户端尝试读取数据 - 没有例外,没有错误

如何检测套接字已关闭的问题?

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();
    }
Run Code Online (Sandbox Code Playgroud)

永远不会抛出异常.它说Written 60 bytes.有任何想法吗?


UPDATE

这是我阅读回复的方式.我等待数据,读取前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;
    }
Run Code Online (Sandbox Code Playgroud)

Ste*_*lse 1

它说它写了 60 个字节,因为它确实写了。服务器不再监听。您需要获取输入流以查看是否有任何内容。如果没有任何返回,那么您就知道连接不起作用。

更新

使用计时器来确定服务器是否正在响应。

Long currenttime = System.currentTimeMillis();
while(System.currentTimeMillis() - currentTime < x){ //x = miliseconds you want to wait
    (try to read from server)
}
Run Code Online (Sandbox Code Playgroud)

这样,如果花费的时间超过 x 秒,它将超时,您可以在 while 循环后执行一些错误捕获