여보세요의 자바 구현 / 안녕하세요 간단한 네트워크 채팅 프로그램

클라이언트와 서버 사이의 자바 소켓 연결을 사용하여 클라이언트가 반복적으로 서버에 데이터를 전송하는 기능을 실현. 즉, 사용자는 콘솔에 하나씩 계속 입력하고 서버에 컨텐츠를 전송 할 수 있습니다. 그리고 서버에 표시됩니다.

소켓 정의

        양방향 통신을 통해 네트워크에 두 프로그램은 소켓의 연결 종료라는 데이터 교환을 실현합니다.
포트 번호 (소켓)의 적어도 하나의 쌍에 대한 네트워크 통신 접속을 설정. 소켓은 기본적으로 TCP / IP 캡슐화를위한 프로그래밍 인터페이스 (API)이며, TCP / IP도 사용할 웹 개발을 할 프로그래머를위한 인터페이스를 제공,이 소켓 프로그래밍 인터페이스이며, HTTP가 세단 형 자동차는 포장 또는 표시 데이터를 제공 특정 형태, 소켓 엔진은 네트워크 통신 할 수있는 기능을 제공합니다.
        영어 소켓 원래 의미는 "구멍"또는이다 "소켓." BSD UNIX 프로세스 통신 메커니즘으로, 이후 하나의 의미를 가지고. 일반적으로 "소켓"IP 주소와 포트를 설명하는 데 사용되는라고, 통신 링크는 핸들이 다른 가상 머신 간 또는 서로 다른 컴퓨터의 통신을 가능하게 사용될 수있다. 여러 서비스를 제공하면서 인터넷에서 호스트는 일반적으로 여러 소프트웨어 서비스를 실행. 포트에 각 소켓을 열 것입니다 서비스 및 바인드는 다른 포트는 다른 서비스에 해당. 다공성 콘센트처럼 영어로 원래의 의미로 소켓. 다양한 객실 덮여 호스트 소켓은, 각 소켓에 일련 번호를 가지고 있다면, 일부 출구 220 볼트 AC를 제공하고, 다른 케이블 프로그램을 제공하면서 일부는 볼트 AC (110)를 제공한다. 클라이언트 소프트웨어는 서로 다른 서비스를받을 수 있으며, 소켓 다른 번호로 연결됩니다.
        간단히 말해, 우리는 네트워크에 그 데이터가 물 파이프 물에서 볼 수있는, 지금은 상수도 서버 인 클라이언트는 자신의 가정, 그 파이프의 외부까지 그 집합입니다 광섬유, 전화선 등의 확산은 미디어 네트워크 신호는, 이제 직접 물 공장 깨진 물 파이프 찔 수, 다음 집으로 다시 ??이 확실하지 않거나 나는 물이 여전히 킬을 충전 할 때 물에 원하지 않는 직접 다른 쪽 끝을 찔러 수 있습니다 그냥 집에 도둑질하지 물이 당신이 물은 제어도 설치 당신의 자신의 가정의 등, 아 밸브 제어를 통해 밸브 흐름, 또는 물 후 물 밸브하고 과거의 필요성을 얻으려면이 시간이 너무 수수료 너희 카운트 아, 하, 하, 하

        소켓 통신 모델 :

 

 프로그램은 다음을 달성하기 위해 :

클라이언트 :

오기 때 java.io.IOException;
 오기 를 java.io.PrintWriter;
 오기 java.net.Socket의,
 오기 java.net.UnknownHostException;
 오기 java.util.Scanner; 


공용  클래스 클라이언트 { 

    공공  정적  무효 메인 (문자열 []에 args) { 

        소켓 소켓 = 널 (null) ; // 서버와의 소켓 연결 
        에 스캐너와 fromKey = 널 (null) ; // 키보드 입력 스트림 
        스캐너 fromServer = 널 (null) ; // 서버가 보낸 바이트 스트림을 취득 
        의 PrintWriter toServer = 널 (null) ; //바이트 스트림 서버로 전송 

        은 try {
             // 연결된 서버 소켓 
            소켓 = 새로운 새로운 소켓 ( "로컬 호스트", 8866 ); 

            / * 
             * 참고 :이 소켓에 먼저 입력 스트림을 얻을되지 않은 서버와 클라이언트를 이끌 차단 
             * * / 
            // 예시적인 바이트 스트림이 서버로부터 판독 
            fromServer = 새로운 새로운 스캐너 (Socket.getInputStream ());
             // 바이트 스트림 물품 인스턴스화 서버 
            = toServer 새로운 새 의 PrintWriter (Socket.getOutputStream을 ());
             // 키보드 입력 스트림의 인스턴스 
            와 fromKey =에 새로운 새로운 스캐너합니다 (System.in)를, 

            그동안을 (fromServer.hasNextLine ()) {
                 //서버에 대한 대기 차단 된 것은 메시지를 보내 
                문자열 fromServerData = fromServer.nextLine를 (); 
                에서 System.out.println ( "서버 :"+ fromServerData); 
                System.out.print을 ( "I (클라이언트) :" );
                 // 입력 데이터를 얻을 수 
                toServerData = 문자열 fromKey.nextLine ();
                 // 서버에 전송 
                toServer.println (toServerData) 
                toServer.flush (); 
            } 

        } 캐치 (IOException가 E) {
             // 해야할 일 자동 생성 된 블록 캐치 
            e.printStackTrace (); 
        } 최종적으로{
             시도 { 
                ) fromServer.close을 (; 
                () toServer.close; 
                socket.close (); 
            } 캐치 (IOException이 전자) {
                 // TODO 자동 생성 된 catch 블록의 
                e.printStackTrace (); 
            } 
        } 


    } 

}

서버 :

오기 때 java.io.IOException;
 오기 를 java.io.PrintWriter;
 오기 java.net.ServerSocket에,
 수입 java.net.Socket의,
 수입 java.util.Scanner; 

공용  클래스 서버 { 

    공공  정적  무효 메인 (문자열 []에 args) { 

        ServerSocket의 ServerSocket를 = 널 (null) ; // 열려있는 소켓 
        소켓 소켓 = 널 (null) ; // 링크 클라이언트 소켓 
        스캐너와 fromKey = 널 (null) ; // 키보드 입력 스트림 
        스캐너 fromClient = 널 (null) ; //클라이언트에서 읽은 바이트 스트림 취득 
        의 PrintWriter toClient = 널 (null)를 ; //이 바이트 스트림으로 쓰기에 클라이언트를 얻을 

        은 try를 { 
            ServerSocket를 = 새로운 새로운 ServerSocket의 (8866 ) 
            에서 System.out.println ( 서버가 시작 ", 클라이언트 링크에 대한 대기 " );
             // 연결된 클라이언트 소켓 
            소켓 = ServerSocket.accept () 

            // 클라이언트에 인스턴스화 쓰기 바이트 스트림 
            toClient = 새 새 )에의 PrintWriter (Socket.getOutputStream (); 
            toClient.println ( "안녕하세요 클라이언트 아! " ); 
            toClient.flush (); 
            에서 System.out.println ( "I (서버) : 클라이언트 안녕하세요! ");
             / * 
             * 참고 : 서버와 클라이언트가 먼저 소켓 차단의 원인이됩니다, 입력 스트림을 얻을하지 않습니다 
             * * / 
            // 인스턴스화 바이트 스트림을 서버에서 읽어 
            fromClient = 새로운 새로운 스캐너 (Socket.getInputStream ());
             // 키보드 입력 스트림의 인스턴스 
            와 fromKey =에 새로운 새로운 스캐너합니다 (System.in을); 

            // 보낸 클라이언트를 기다리는 차단 
            그동안을 (fromClient.hasNextLine ()) { 
                문자열 fromClientData = fromClient.nextLine (); 
                에서 System.out.println ( " 클라이언트 : "+ fromClientData); 
                System.out.print ( "I (서버 측) : " );
                 //획득 입력 데이터 
                문자열 = toClientData fromKey.nextLine ();
                 // 클라이언트로 전송 
                toClient.println (toClientData) 
                toClient.flush (); 
            } 

        } 캐치 (IOException가 E) {
             // 해야할 일 캐치를 자동 생성 블록 
            E. 의 printStackTrace (); 
        } 최종적으로 {
             은 try { 
                fromClient.close (); 
                toClient.close (); 
                Socket.close (); 
            } 캐치 (IOException가 E) {
                 //TODO catch 블록의 자동 생성 
                ) (e.printStackTrace을; 
            } 
        } 


    } 

}

소켓 API 통신 과정과 전체 해상도

 UDP와 TCP 소켓 통신 프로세스는 구성은 수신 전화와 동일하지 않습니다, 기본적으로 동일 경우에만 API를, 전체 프로세스를보고 예를 들어 TCP 클라이언트 / 서버 모델.

 

1. 소켓 ()

  #INCLUDE <SYS / types.h> / * 참조 메모 * / 
       #INCLUDE <SYS / socket.h> 
       INT 소켓 (도메인 INT, INT 유형 INT 프로토콜) 
    
    - 매개 변수 설명 
    도메인 : 통신 프로토콜 도메인 소켓 측을 설정 지역 / 인터넷 IP4 또는 IP6 
       이름 목적 매뉴얼 페이지 
       AF_UNIX, AF_LOCAL 지역 통신 UNIX (7) 
       AF_INET의 IPv4 인터넷 프로토콜 IP (7) 
       AF_INET6 IPv6 인터넷 프로토콜 IPv6를 (7) 

    유형 : 소켓 세트 유형, 일반적으로 사용 
        SOCK_STREAM - 일반 는 TCP, SCTP에 해당 
        일반적으로 UDP에 해당 - SOCK_DGRAM 
        SOCK_RAW -
         
    프로토콜 : 통신에 사용되는 전송 계층 프로토콜 세트이다
    공통 프로토콜 등 IPPROTO_TCP, IPPTOTO_UDP, IPPROTO_SCTP, IPPROTO_TIPC을 가지고, 0으로 자신이 선택한 시스템을 설정할 수 있습니다. 해당 프로토콜 및 유형 무작위 조합하지 않습니다.

  소켓 () API는의 glibc에서 호출 체인과 같이 sys_socket 커널 ()를 설정하는 함수 호출을 구현됩니다.

     

        내가 읽을 필요가 없습니다 실현 커널 상세 일반적으로 이해했다. 전화 소켓 () 커널 공간과 관련 구성 저장 메모리를 할당 함. 협회는이 커널 메모리 및 파일 시스템, 파일 핸들에 의해 / 쓰기 소켓에 액세스하려면이 구성을 수정하거나 읽을 수있을 것이다 것입니다 동안. 같은 파일의 작동과 같은 소켓 작업이 문구는 유닉스 모든 파일이어야합니다. 핸들 프리젠 테이션 시스템의 최대 수는 / proc 디렉토리 /에서 sys / FS / 제한됩니다 파일 최대 사용 가능한 파일 핸들 세트 최대 수입니다. 물론, 이것은 리눅스 구성, 당신은 방법을 참조하십시오 변경할 수 있습니다 파일 열기 번호의 설명에 증가 사람은 160 만 연결을했다.

2. 결합 ()

#INCLUDE <SYS / types.h> NOTES * /에서 / * 참조 
   #INCLUDE <SYS / socket.h> 
   INT 바인드 (INT는 * ADDR 상기의 socklen_t addrlen SOCKADDR를 구조체 CONST, sockfd와) 
   
   파라미터 
   sockfd와 : 소켓 ()에서 얻어진 전 핸들 파일 
   주소 : 바인드 주소, IP 주소, 로컬 파일 경로를 제공 할 수있다 
   addrlen : 어드레스 길이 
   
   설명 기능 
   바인드 () 소켓 통신 주소 세트를, 모든 경우에 인터페이스가있는 경우, 시스템에 INADDR_ANY 서버 기울인다를 나타낸다 127.0.0.1 모니터 로컬 통신 처리 (또한 외부 프로세스 아 고려하지 않음)했다.

) (듣기 (3)

사용법 #include <SYS / types.h> 노트 / * 참조 * / 
   사용법 #include <SYS / socket.h> 
   INT 청취 (INT는 INT 백 로그를 sockfd와) 
   
   매개 변수 
   sockfd와 : 소켓 () 파일 핸들을 취득하기 전에 
   백 로그 : 설정 서버 큐가있을 것이다 말 동시에 수신 될 수있는 링크의 최대 개수, 연결 서버 프로세스는 큐의 길이를 설정 듣는다. 
   
   기능은 
   , 서버 측에 사용되는 () 청취 수신 큐의 길이를 제공 하였다. 큐가 가득 찬 경우, 연결의 서버 측 폐기 또는 새 클라이언트 ECONNREFUSED 회신 할 수 있습니다.
   

() 동의 (4)

#INCLUDE <SYS / types.h> / * 참조 메모 * / 
   #INCLUDE <SYS / socket.h> 
   INT 수락 (INT는 * ADDR은 상기의 socklen_t는 * addrlen SOCKADDR를 구조체 sockfd와) 
   
   파라미터 : 
   주소 : 피어 어드레스 
   addrlen : 주소 길이 
   
   기능 설명 : 
   동의 ()는 큐, 새로운 소켓 반환에서 보류중인 연결이 부족합니다. 
   우리는 이전 청취 소켓에서 다른 새로운 소켓에 연결된 소켓을했다. 
   소켓을 듣고 고객과 후속 데이터 상호 작용에 대한 연결된 소켓 서버는 새로운 연결을 기다리는 계속합니다. 
   큐가 연결이 없을 때 fcntl을하여 소켓 ()가 O_NONBLOCK로 설정되어있는 경우, 그렇지 않은 경우 일반적으로 차단 () 차단하지 않습니다 동의합니다.
    

질문 : 커널은 청취 소켓과 연결된 소켓 그것을 구별하는 방법은? ? 두 사람은 같은 커널없는 배의하지만 어떻게 APP와 상호 작용 소켓되는 알고? 내용을 분석함으로써, SYN 또는 데이터입니까? 그것은 의심 스럽다.

()에 연결 5.

  #INCLUDE <SYS / types.h> 메모 / * 참조 * / 
   #INCLUDE <SYS / socket.h> 
   INT 연결 (INT는 CONST SOCKADDR ADDR * 상기의 socklen_t addrlen을 sockfd와 구조체) 
   
   파라미터 : 
   sockfd와 : 소켓 표시된 FILEHANDLE의 
   요지 : 서버 측 어드레스 
   addrlen : 주소 길이 
   
   정보 기능 : 
   CONNECT () 연결 모두를 확립. 
   TCP 연결에 성공적으로 반환이 설정된 후 TCP 연결의 연결 () 실제로 연결 TCP 세 방향 핸드 셰이크를 시작했다.  
   UDP의 경우, UDP부터 통신 단말기의 주소를 지정하는 데 사용할 수 있습니다 비 연결, 연결은 ()이며, 이후의 데이터 전송 ()에는 주소를 입력 할 필요가 없습니다를 보낼 수 있습니다. 
   UDP는 물론 사용할 수없는 연결 (), sendto를의 목적지 주소 ()를 지정하기 위해 설립 소켓 ().

  

추천

출처www.cnblogs.com/sunxiangyang/p/12013397.html