자바를 달성하기 위해 인터넷 채팅 프로그램을 기반으로 자바 네트워크 API 및 Linux 소켓 API의 관계를 분석하여

1. 소개

  소켓 네트워크 프로그래밍, 우리는 TCP 프로토콜 자바 기반의 C / S 모드 "안녕하세요 / 안녕하세요"인터넷 채팅 프로그램을 사용하여 여기에 다른 통신 프로토콜을 지정할 수 있습니다

2. 목표

  1)., 네트워크를 통해 프로그램을 채팅 기본적인 사용 자바 소켓 API 인터페이스를 이해하는

  2). 자바 소켓 API 개요

  3). 리눅스 소켓 API의 간단한 분석

  4) 연결 및 프로토콜 종료 TCP

  5). 자바 소켓 API 및 리눅스 소켓 API 사이의 관계를 탐구

3. 리눅스 소켓 API의 간단한 분석

   

   계약의 1).의 TCP 간략한 개요

    TCP 바이트 스트림 전송 프로토콜 계층은 타이머가 동시에 시작되고 그것이 패킹 사용자 데이터 세그먼트하여 전송을 생성, 안정적인 연결 지향 프로토콜의 서비스를 제공하며, 데이터를 동시에 확인 할 수신 단말기, 데이터 재정렬 장애 파기 중복 데이터를.

    TCP 접속 지향 각 데이터 전송 연결이 제 단부 사이에 설정되는 것을 의미한다;의 전송 종료에 대한 연결을 닫아야

    A). 연결을 설정하기

      클라이언트 : 요청 송신자, 서버 : 데이터 수신기

      를 통해 연결을 설정하는 세 방향 핸드 셰이크를 TCP

      > 서버가 다시 응답으로 SYN 세그먼트를 보냅니다 - - 클라이언트는 먼저 메시지 세그먼트를 열고 활동을 전송> 클라이언트는 세그먼트를 확인하기 위해 서버에 응답을 전송

    b). 연결을 종료

      전이중 TCP 연결은 두 방향으로 폐쇄했기 때문에 TCP는 4 방향 핸드 쉐이크가 연결을 종료해야하고, 각하여 네 방향 핸드 셰이크를 필요로 폐쇄를 확인해야합니다

  2). API 분석

      A). 설립 및 종료

      실패가 / 리턴 할 때 연결을 설정하는 세 방향 핸드 셰이크를 수행 할 때 클라이언트가 연결 () 메서드를 호출의 연결은 설립

      이전에는이에, 서버는 항상 클라이언트의 요청을 기다리고 차단됩니다

      연결이 데이터 전송을 위해, 클라이언트와 서버를 구축 할 때

      전송 후, 클라이언트는 가까운 () 메서드를 호출

    비). 묶다

      그것은 소켓의 로컬 프로토콜 주소로 주어집니다

    기음). 들리다

      서버가 소켓 ()를 호출 할 때,이 (연결 호출 원래 클라이언트 소켓 연결에 대한) 활성 연결이며, 커널이 소켓 연결 요청에 포인트를 수신, 그것은 수동적 인 연결로 변환 된 후) (듣고 있다고 가정

      커널은 두 개의 큐를 유지 : 연결을 완료하지 큐 연결 큐를 완료

    디). 동의

      클라이언트가 연결하고, 서버 측에서 완료되지 않은 연결 큐에 엔트리를 생성 할 때, 접속이 완료되는 시간이 완료된 연결 대기열에 대한 엔트리를 이동

      연결이 연결을 얻기 위해 대기열에서 완료 수락 완료

4. 자바 간단한 바탕으로 "안녕하세요 / 안녕하세요"네트워크 채팅 프로그램

. (1 개)  오기 는 java.io은 * ]
 2  오기 java.net.ServerSocket에]
 . (3)  수입 java.net.Socket의]
 . 4  
. 5  공용  클래스 서버 {
 . 6      공공  정적  무효 메인 (문자열 []에 args) 발생 예외 {
 . 7          에서 System.out.println는 ( "서버 시작은 ... 연결 대기" );
 8          // 1. ServerSocket의 객체 바운드 포트 만들기를 연결 대기 시작 
9.          ServerSocket의 서버 = 새로운 새로운 ServerSocket의 (6666를 )
 10          // 2. 연결이 동의를받는 방법을 소켓 객체를 반환,이 방법은 블록 들어오는 연결 때까지 새로운 소켓을 반환 
(11)         소켓 = 소켓 server.accept ();
 12이다          // 3. 입력 스트림 얻어 
13는          , InputStream 인이 = IS Socket.getInputStream ();
 (14)          // 제 한번 읽을 데이터 
15          바이트 [] B = 새로운 새  바이트 [1024 ]
 16          INT LEN = is.read (B)]
 . 17          // 파싱 어레이 
18          문자열 MSG = 새로운 새 문자열 (B, 0 , 렌)]
 .도 19          에서 System.out.println는 ( "는이 클라이언트 ->에서"+ MSG)
 20가  
21          // 클라이언트에 기록 데이터에 대한 출력 스트림을 구하는 제 
22          = OutputStream에 OUTsocket.getOutputStream ();
23          out.write ( "안녕" .getBytes ());
24          // 关闭资源
25          out.close ();
26          is.close ();
27          server.close ();
28      }
 29 }
. (1 개)  오기 는 java.io은 * ]
 2  오기 java.net.Socket의]
 . 3  
. 4  공용  클래스 클라이언트 {
 . 5      공공  정적  무효 메인 (문자열 []에 args) 발생 예외 {
 6.          에서 System.out.println ( "데이터 전송 클라이언트" ) ;
 7          // 1 소켓 만들기 연결 위치를 결정한다 
. (8)          = 소켓 클라이언트 새로운 새로운 ( "로컬 호스트"6666를 소켓 )
 . 9          // 2 출력 스트림 구 
10          OutputStream에 OS = client.getOutputStream ()
 . 11          //를 3.. 쓰기 데이터 
(12)         os.write ( "헬로" .getBytes ());
 (13)가          // 4. 취득한 입력 스트림이 서버로부터 반환 된 정보를 획득한다 
(14)          = 상기 InputStream에서 client.getInputStream ();
 15  
(16)          // 제가 서버로부터 반환 된 판독을 데이터 
. 17          바이트 [] B = 새로운 새  바이트 [100 ]
 (18)는          INT LEN = in.read (B)]
 .도 19          에서 System.out.println ( "는 급유가 가입일>"+ 새로운 새 문자열 (B, 0 , 렌))
 (20)가          // 근접 자원 
(21)은          in.close ();
 22은          os.close ();
 23은          client.close ();
 24      }
25 }

그들 사이 5. 자바 소켓 API 관계와 리눅스 소켓 API

  상기 절차에 의해, 우리는 이하 리눅스 바인드 (비교 자바 서버 측 준수) 및 청취 할 수 () 메소드 개의 클라이언트 연결할 수 () 메소드

  우리는 자바와 리눅스 끊어 측 API 대응을보고, 다음은 인터넷의지도입니다, 네트워크 소스 ( https://blog.csdn.net/vipshop_fin_dev/article/details/102966081 )

  

 

 

     리눅스 시스템 시간에 실행하는 경우, JVM 리눅스 기본 통화 소켓 () 함수, 우리는 해당 서버 측 API를 비교

  . ServerSocket를 서버는 새로운 ServerSocket로 (6666)를 =; 소켓을 생성되며, 하부 층 (리눅스 API에 대응하는) 세 가지 프로세스를 달성하는 동안 :

    소켓 만들기 1

      네트워크 I / O를 수행하기 위해, 우리는 먼저 공정 소켓 함수를 호출해야하며, 원하는 프로토콜 종류와 소켓 유형을 지정합니다

      때 모든 리눅스의 파일이기 때문에이 정수 파일 기술자를 나타냅니다 있도록 성공적인 소켓 기능, 작은 음이 아닌 정수를 반환

      이 구조에 대응하는 소켓을 생성하고 매핑하고 파일에 개방 된

    2. 소켓에 대응하는 대응하는 로컬 프로토콜 주소 (bind 함수)

      TCP 프로토콜의 경우, 결합 및 기능 바인딩 IP 포트 일 수있다,이 경우, 소켓의 상태 TCP_CLOSE

      포트 번호를 결합하지 않는 경우, 커널은 임시 포트에 대한 소켓을 바인딩

      서버 아니 바인드 IP 주소를 할 경우, 커널은 서버의 소스 IP 주소로 클라이언트 SYN 대상 IP 주소를 보내드립니다

    3. 듣기) (듣기

      위에서 알 수는 수동적 인 연결에 활성화됩니다 청취 소켓이 상태 linsten에 닫힌 상태에서 변환됩니다, 두 개의 큐를 유지

      此时会和客户端进行三次握手来建立连接

      

  b. Socket socket = server.accept();

 

 

     linux中由TCP服务器调用,从已完成的连接队列的队头返回下一个已完成连接;成功则会返回由内核创建的新的描述符;

    在并发服务器中,accept()返回后,服务器会调用fork函数,创建一个子进程,由该子进程来和客户端进行通讯,此时套接口对应文件描述符的引用计数会增加

    同时父进程会关闭该已连接套接字,即会将引用计数减少。然后在原有的监听套接口上,继续监听有无其他连接,当由连接的时候,再次accept处理连接

  c. server.close();

    当待关闭的socket的描述符的引用计数为0的时候才会真正的关闭连接

 

参考来源:

  1. https://blog.csdn.net/vipshop_fin_dev/article/details/102966081

  2. 《UNIX网络编程》

추천

출처www.cnblogs.com/zhouz/p/11980538.html