자바 socket 의 정확 한 닫 기 자세

5232 단어 자바socket닫다
자바 socket 은 네트워크 프로 토 콜 의 tcp,tcp 의 세 번 의 악수,네 번 의 손 흔 들 기,11 중 상태 에 대응 합 니 다.여 기 는 말 하지 않 겠 습 니 다.여러분 이 평소에 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 은 출력 흐름 이나 입력 흐름 을 다시 열 수 없 기 때문에 지속 적 인 통신 상 태 를 유지 해 야 하 는 대화 형 응용 에 적합 하지 않 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기