나는 자바 소켓 프로그래밍에 익숙하지 않지만 문제에 직면했습니다.
클라이언트 측에서 예기치 않게 닫힌 연결에 쓰려고 할 때 예외가 발생하지 않습니다. 나는 서버 측이 있습니다.
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;
}
연결 직후 클라이언트가 종료되는 것을 볼 수 있듯이 소켓을 닫지 않고 예기치 않게 종료 된 클라이언트를 모델링하려고합니다. 그러나 소켓에 쓰기를 시도하는 동안 서버 측에서 예외가 발생하지 않습니다. 왜?
TCP는 피어가 읽기를 위해 연결을 닫았 음을 FIN을 수신 할 때 알 수 없습니다. 피어가 쓰기를 위해 연결을 닫았다는 것만 알고 있습니다. 출력을 위해 연결을 종료하고 여전히 읽고있을 수 있습니다. 따라서 이러한 연결에 대한 첫 번째 쓰기는 오류가 될 수 없습니다.
TCP 연결에 쓸 때 데이터는 소켓 전송 버퍼에서 로컬로 버퍼링되고 제어가 응용 프로그램에 반환됩니다. 네트워크 쓰기는 비동기 적으로 진행됩니다. 따라서 피어에 의해 이미 닫힌 연결에 대한 첫 번째 쓰기는이를 감지 할 가능성이 낮습니다. 후속 쓰기가 수행됩니다.
NB 귀하의 질문은 닫힌 소켓에 쓰는 것이 아니라 피어에 의해 닫힌 연결에 쓰는 것에 관한 것입니다. 그러면 즉시 EBADF를 얻을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다