자바 socket 의 정확 한 닫 기 자세
예 를 들 면:
java.net.SocketException:socket is closed
오류 알림 의 출현 장면:
스스로 socket 을 닫 았 지만,그 후에 도 안에서 데 이 터 를 읽 고 썼 다.
Software caused connection abort: socket write error
오류 알림 의 출현 장면:
대상 이 socket 을 닫 았 지만,여전히 상대방 에 게 데 이 터 를 씁 니 다.
connection reset (by peer)
오류 알림 이 나타 난 필드:
한쪽 socket 이 닫 히 고 다른 한쪽 은 데 이 터 를 보 냅 니 다.보 낸 첫 번 째 패 킷 connection reset by peer
한쪽 socket 이 종료 되 었 습 니 다.종료 시 연결 을 닫 고 다른 한쪽 은 데이터 connection reset 을 읽 습 니 다.
따라서 socket 을 사용 할 때,쌍방 이 읽 고 쓰기 가 완 료 된 조건 을 약속 한 다음,입 출력 흐름 을 닫 아야 합 니 다:
socket.shutdownInput();
socket.shutdownOutput();
즉,한 측 이 기록 이 완료 되면 shutdown Output 을 호출 하여 출력 흐름 을 닫 습 니 다.이때 상대방 의 read 방법 은-1 로 돌아 갑 니 다.이때 상대방 은 당신 이 다 썼 다 는 것 을 알 게 되 었 습 니 다.상대방 은 입력 흐름 을 닫 고 상대방 이 shutdown Output 을 호출 한 후에 우리 측 이 shutdown Input 을 호출 하면 쌍방 은 정상적으로 입력 출력 흐름 을 닫 을 수 있 습 니 다.이 럴 때 소켓 에 이상 이 생기 지 않 습 니 다.다음은 socket 상호작용 의 예 입 니 다.
서버 엔 드
public class OioServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("socket = " + socket);
new Thread(() -> {
try {
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write("hello! I get your message that is follow".getBytes(Charset.forName("UTF-8")));
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) {
System.out.print(new String(buf, 0, len, Charset.forName("UTF-8")));
out.write(buf, 0, len);
}
out.write("
end
".getBytes(Charset.forName("UTF-8")));
out.flush();
socket.shutdownInput();
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
클 라 이언 트 엔 드
public class OioClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8080);
InputStream in = socket.getInputStream();
new Thread(() -> {
BufferedInputStream bufferIn = new BufferedInputStream(in);
byte[] buf = new byte[1024];
try {
int len;
while ((len = bufferIn.read(buf)) != -1) {
System.out.print(new String(buf, 0, len, Charset.forName("UTF-8")));
}
}catch (Exception e) {
e.printStackTrace();
}
try {
socket.shutdownInput();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
OutputStream out = socket.getOutputStream();
int cout = 10;
while (cout-- > 0) {
out.write(("this time is " + System.currentTimeMillis() + "
").getBytes("UTF-8"));
}
socket.shutdownOutput();
}
}
자바 소켓-반 닫 기일반적으로 출력 이 끝 났 음 을 나타 내기 위해 출력 흐름 을 닫 습 니 다.그러나 인터넷 통신 을 할 때 는 그 럴 수 없다.출력 흐름 을 닫 을 때 이 출력 흐름 에 대응 하 는 Socket 도 닫 히 기 때문에 프로그램 이 이 socket 에서 데 이 터 를 읽 을 수 없습니다.
이러한 상황 에 대비 하여 socket 은 socket 의 입력 흐름 이나 출력 흐름 만 닫 는 두 가지 반 닫 는 방법 을 제공 하여 출력 데이터 가 이미 발송 되 었 음 을 나타 낸다.
방법 상세 정보:
shutdown Input():이 socket 의 입력 흐름 을 닫 고 프로그램 은 이 socket 의 출력 흐름 을 통 해 데 이 터 를 출력 할 수 있 습 니 다.
shutdown Output():이 socket 의 출력 흐름 을 닫 고 프로그램 은 이 socket 의 입력 흐름 을 통 해 데 이 터 를 읽 을 수 있 습 니 다.
shutdown Input()이나 shutdown Output()방법 으로 입력 흐름 이나 출력 흐름 을 닫 으 면 이 socket 은 반 닫 힌 상태 입 니 다.
이 때 isInputShutdown()또는 isOutputShutdown()을 사용 하여 이 socket 이 반 독 상태 나 반 쓰기 상태 인지 판단 할 수 있 습 니 다.
주의해 야 할 것 은 같은 socket 이 선후 로 shutdown Input()과 shutdown Input()방법 을 호출 하 더 라 도 이 socket 인 스 턴 스 는 닫 히 지 않 았 습 니 다.다만 이 socket 은 데 이 터 를 출력 할 수도 읽 을 수도 없 을 뿐 입 니 다.
shutdown Input()이나 shutdown Output()방법 을 호출 하여 입력 흐름 이나 출력 흐름 을 닫 은 후 이 socket 은 출력 흐름 이나 입력 흐름 을 다시 열 수 없 기 때문에 지속 적 인 통신 상 태 를 유지 해 야 하 는 대화 형 응용 에 적합 하지 않 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.