[자바]소켓 과 ServerSocket 학습 노트

인 스 턴 트 클래스 나 인 스 턴 트 클래스 의 게임 에 대해 HTTP 프로 토 콜 은 우리 의 수 요 를 만족 시 키 지 못 할 때 가 많 습 니 다.이 회 의 는 Socket 이 우리 에 게 매우 실 용적 이다.다음은 이번 학습 노트 입 니 다.주로 이상 유형,상호작용 원리,Socket,ServerSocket,다 중 스 레 드 등 몇 가지 측면 에서 논술 한다.
이상 유형
Socket 의 내용 을 알 기 전에 관련 된 이상 유형 을 알 아 봐 야 합 니 다.다음 네 가지 유형 은 모두 IOException 에 계승 되 기 때문에 나중에 IOException 을 바로 꺼 내 면 된다.
UnkownHostException:   호스트 이름 이나 IP 오류
ConnectException:  서버 연결 거부,서버 가 시작 되 지 않 았 습 니 다.(대기 열 수 초과,연결 거부)
SocketTimeoutException: 연결 시간 초과
BindException:  Socket 대상 은 로 컬 IP 주소 나 포트 와 연결 할 수 없습니다.
대화 식 프로 세 스
Socket 과 ServerSocket 의 상호작용,아래 의 그림 은 이미 상세 하고 명확 하 게 말 한 것 같 습 니 다.

Socket
구조 함수

Socket()

Socket(InetAddress address, int port)throws UnknownHostException, IOException

Socket(InetAddress address, int port, InetAddress localAddress, int localPort)throws IOException

Socket(String host, int port)throws UnknownHostException, IOException

Socket(String host, int port, InetAddress localAddress, int localPort)throws IOException
첫 번 째 인자 가 없 는 것 을 제외 하고 다른 구조 함 수 는 서버 와 의 연결 을 시도 합 니 다.실패 하면 IOException 오 류 를 던 집 니 다.성공 하면 Socket 대상 으로 돌아 갑 니 다.
InetAddress 는 호스트 를 기록 하 는 클래스 입 니 다.정적 getHostByName(String msg)은 인 스 턴 스 를 되 돌려 줍 니 다.정적 방법 getLocalhost()도 현재 호스트 의 IP 주 소 를 얻 고 인 스 턴 스 를 되 돌려 줍 니 다.Socket(String host,int port,InetAddress localAddress,int localPort)구조 함수 의 매개 변 수 는 각각 목표 IP,목표 포트,로 컬 IP 연결,로 컬 포트 연결 입 니 다.
Socket 방법
getInetAddress();    원 격 서버 의 IP 주소
getPort();    원 격 서버 포트
getLocalAddress()    로 컬 클 라 이언 트 의 IP 주소
getLocalPort()    로 컬 클 라 이언 트 포트
getInputStream();    입력 흐름 가 져 오기
getOutStream();    출력 흐름 가 져 오기
주의해 야 할 것 은 이러한 방법 중에서 가장 중요 한 것 은 getInputStream()과 getOutputStream()이다.
소켓 상태
isClosed();        //연결 이 닫 혔 는 지,닫 히 면 true 로 돌아 갑 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.
isConnect();//연 결 된 적 이 있다 면 true 로 돌아 갑 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.
isBound();        //Socket 이 로 컬 포트 와 연결 되 어 있다 면 true 로 돌아 갑 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.
소켓 의 상태 가 연결 되 어 있 는 지 확인 하려 면 아래 문 구 는 좋 은 판단 방식 이다.

boolean isConnection=socket.isConnected() && !socket.isClosed();  //          
반 닫 기 Socket
얻 은 입력 흐름 에서 얼마나 읽 어야 끝 날 지 모 르 는 경우 가 많다.다음은 비교적 보편적 인 방법 이다.
사용자 정의 식별 자(예 를 들 어 아래 의 예,"by"문자열 을 받 았 을 때 Socket 을 닫 습 니 다)읽 기 길 이 를 알려 줍 니 다.
모든 데 이 터 를 읽 었 습 니 다.
  • Socket 이 close 를 호출 할 때 닫 을 때 입 출력 흐름 을 닫 습 니 다
  • ServerSocket
    구조 함수
    
    ServerSocket()throws IOException
    
    ServerSocket(int port)throws IOException
    
    ServerSocket(int port, int backlog)throws IOException
    
    ServerSocket(int port, int backlog, InetAddress bindAddr)throws IOException
    
    주의 점:
    1.port 서버 에서 감청 할 포트;backlog 클 라 이언 트 연결 요청 대기 열 길이;bindAddr 서버 바 인 딩 IP
    2.포트 가 점용 되 거나 일부 포트 를 사용 할 수 있 는 권한 이 없 으 면 BindException 오류 가 발생 합 니 다.예 를 들 어 1~1023 포트 는 관리자 가 있어 야 연결 할 수 있 습 니 다.
    3.포트 를 0 으로 설정 하면 시스템 은 자동 으로 포트 를 할당 합 니 다.
    4.biddr 는 서버 IP 를 연결 하 는 데 사 용 됩 니 다.왜 이런 설정 이 있 습 니까?예 를 들 어 일부 기계 에 여러 개의 네트워크 카드 가 있 습 니 다.
    5.ServerSocket 이 감청 포트 에 연결 되면 변경 할 수 없습니다.ServerSocket()은 바 인 딩 포트 앞 에 다른 인 자 를 설정 할 수 있 습 니 다.
     단일 스 레 드 의 ServerSocket 예
    
    public void service(){
      while(true){
        Socket socket=null;
        try{
          socket=serverSocket.accept();//            ,       
          System.out.println("    :"+socket.getInetAddress()+":"+socket.getPort());
          ...//       
        }catch(IOException e){e.printStackTrace();}finally{
          try{
            if(socket!=null) socket.close();//           ,   Socket
          }catch(IOException e){e.printStackTrace();}
        }
      }
    }
    다 중 스 레 드 ServerSocket
    다 중 스 레 드 의 장점 은 말 할 필요 도 없고 대부분 장면 은 다 중 스 레 드 입 니 다.우리 의 실시 간 게임 이 든 IM 이 든 다 중 스 레 드 의 수 요 는 필수 적 입 니 다.실현 방식 에 대해 말씀 드 리 겠 습 니 다.
  • 메 인 라인 은 ServerSocket.accept()를 순환 적 으로 실행 합 니 다
  • 4.567917.클 라 이언 트 연결 요청 을 받 았 을 때 Socket 대상 을 다 중 스 레 드 에 전달 하여 다 중 스 레 드 로 하여 금 구체 적 인 작업 을 수행 하 게 합 니 다다 중 스 레 드 를 실현 하 는 방법 은 Thread 류 를 계승 하거나 Runnable 인 터 페 이 스 를 실현 합 니 다.물론 스 레 드 탱크 도 사용 할 수 있 지만 실현 의 본질은 많 지 않다.
     여기 예 를 들 면:
    다음 코드 는 서버 의 메 인 스 레 드 입 니 다.모든 고객 에 게 작업 스 레 드 를 할당 합 니 다:
    
    public void service(){
      while(true){
        Socket socket=null;
        try{
          socket=serverSocket.accept();            //          
          Thread workThread=new Thread(new Handler(socket));  //    
          workThread.start();                  //    
        }catch(Exception e){
          e.printStackTrace();
        }
      }
    }
     물론 이곳 의 중점 은 Handler 라 는 종 류 를 어떻게 실현 하 느 냐 에 있다.Handler 는 Runnable 인 터 페 이 스 를 실현 해 야 합 니 다:
    
    class Handler implements Runnable{
      private Socket socket;
      public Handler(Socket socket){
        this.socket=socket;
      }
      
      public void run(){
        try{
          System.out.println("   :"+socket.getInetAddress()+":"+socket.getPort());
          Thread.sleep(10000);
        }catch(Exception e){e.printStackTrace();}finally{
          try{
            System.out.println("    :"+socket.getInetAddress()+":"+socket.getPort());
            if(socket!=null)socket.close();
          }catch(IOException e){
            e.printStackTrace();
          }
        }
      }
    }
    
    
    물론 먼저 다 중 스 레 드 와 다른 방식 이 있 습 니 다.예 를 들 어 스 레 드 탱크 나 JVM 자체 스 레 드 탱크 등 이 있 습 니 다.여 기 는 설명 안 할 게 요.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기