我是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();
}
}
Run Code Online (Sandbox Code Playgroud)
和客户
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;
}
Run Code Online (Sandbox Code Playgroud)
正如你可以看到客户端在连接后立即退出,我甚__CODE__至在尝试写入套接字时不会在服务器端出现异常.为什么?
TCP无法知道收到对端已关闭连接以进行读取的FIN.它只知道对等体已经关闭了写入连接.它可能已关闭输出连接并仍在读取.所以第一次写这样的连接不能是一个错误.
当您写入TCP连接时,数据将在套接字发送缓冲区中本地缓冲,并将控制权返回给应用程序.写入网络是异步进行的.因此,对同级已经关闭的连接的第一次写入不太可能检测到.随后的写作会.
注意,您的问题是写入已被对等方关闭的连接,而不是写入已关闭的套接字.这会立即给你EBADF.
| 归档时间: |
|
| 查看次数: |
1338 次 |
| 最近记录: |