我是java socket编程的新手,但我遇到了这个问题 当我尝试写入在客户端意外关闭的连接时,我不会得到任何异常。 我有服务器端。
public static void main(String[] args) throws IOException {
ServerSocket socket = new ServerSocket(8036);
String st;
while(true) {
System.out.println("hello");
Socket socket1 = socket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader (socket1.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket1.getOutputStream()));
System.out.println(reader.readLine());
writer.write("h");
writer.flush();
}
}
和客户
public static void main(String[] args) throws Exception{
Inet4Address s = (Inet4Address)Inet4Address.getByName("localhost");
System.out.println("begin");
Socket socket = new Socket(s,8036);
BufferedWriter w = new BufferedWriter (new OutputStreamWriter(socket.getOutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String h ;
int prev = 0;
}
正如您可以看到客户端在连接后立即退出,我甚至在尝试写入套接字时不会在服务器端出现异常t close socket, just try to model client that have exited unexpectedly. However i don
。为什么?
答案 0 :(得分:5)
TCP在接收FIN时无法知道对等方已关闭连接以进行读取。它只知道对等体已经关闭了写入连接。它可能已关闭输出连接并仍在读取。所以第一次写这样的连接不能是一个错误。
当您写入TCP连接时,数据在套接字发送缓冲区中本地缓冲,并且控制权返回给应用程序。写入网络是异步进行的。因此,对同级已经关闭的连接的第一次写入不太可能检测到。随后的写作将会。
请注意,您的问题是写入已被对等方关闭的连接,而不是写入已关闭的套接字。这会立即给你EBADF。