소켓이란?
네트워크의 두 프로그램은이 두 가지 통신 링크의 한쪽 끝을 통해 데이터 교환을 구현합니다. 소켓은 일반적으로 고객과 서비스 파티 간의 연결을 달성하는 데 사용됩니다. 소켓은 TCP/IP 프로토콜의 매우 인기있는 프로그래밍 인터페이스이며 소켓은 IP 주소와 포트 번호로 결정됩니다.
그러나 소켓이 지원하는 프로토콜의 유형은 TCP/IP뿐만 아니라 둘 사이에 반드시 연결이 필요하지 않습니다. Java 환경에서 소켓 프로그래밍은 주로 TCP/IP 프로토콜을 기반으로 한 네트워크 프로그래밍을 나타냅니다.
소켓 통신 과정
서버 엔드 듣기 (모니터)에 연결 요청이 있든 클라이언트는 서버 측에 연결 요청을 보내고 서버는 액세스 메시지를 클라이언트로 다시 보냅니다. 연결이 설정됩니다. 서버와 클라이언트는 모두 보내기, 쓰기 및 기타 방법을 통해 상대방과 통신 할 수 있습니다.
완전한 소켓의 경우 다음과 같은 기본 구조가 포함되어야합니다.
(1) 소켓 생성;
(2) 소켓에 연결된 입력/유출을 엽니 다.
(3) 특정 프로토콜에 따라 소켓의 읽기/쓰기 작동;
(4) 소켓을 끄십시오 (실제 응용 프로그램에서는 표시가 사용되지 않습니다. 많은 기사가 권장되지만 프로그램 자체가 비교적 간단하고 요구 사항이 높지 않기 때문에 가능합니다. 아무것도 유발하지 않습니다.)
소켓을 만듭니다
Java는 java.net에 두 가지 유형의 소켓과 서버 액트를 제공합니다. 이것들은 매우 좋은 두 가지 좋은 수업으로 사용하기 편리합니다. 구조 방법은 다음과 같습니다.
소켓 (IndDress 주소, Int Port) (Int Port, Boolean Stream); LocalAddr, IntAddDress 주소, intadddress localddr) serversocket (int port, int backlock);
그 중에서, 두 개의 중단 연결에서 각각의 IP 주소, 다른 당사자의 포트 번호는 소켓이 스트림 소켓인지를 나타냅니다. Serversocket의 호스트 주소), impl은 소켓의 상위 클래스입니다. 이는 서사 소켓을 생성하는 데 사용할 수 있으며 소켓을 생성하는 데 사용할 수 있습니다. 카운트는 서버가 지원할 수있는 최대 연결 수를 의미합니다. 예를 들어 : 비디오 네트워크 학습 http://www.xxspw.com
소켓 클라이언트 = 새로운 소켓
포트를 선택할 때 조심해야합니다. 각 포트는 올바른 포트를 제공하여 특정 서비스를 제공합니다. 예를 들어 HTTP 서비스의 포트 번호는 80이고, 텔넷 서비스의 포트 번호는 23 개이므로, 우리는 우리가있을 때. 포트 번호를 선택하십시오. 1023보다 큰 하나를 선택하는 것이 가장 좋습니다. 숫자는 충돌을 방지하는 것입니다.
소켓을 만들 때 오류가 발생하면 IOException이 생성되며 프로그램에서 처리해야합니다. 따라서 소켓 또는 서버 소켓 생성을 캡처하거나 던져야합니다.
암호
섬기는 사람
패키지 소켓; import java.net accept (); bufferedReader input = new bufferedReader (client.getInputStream ()) {system.out.println; " +count +"times! "); count ++; String line = input.readline ();"client : " +line); if ("line.equals ( "Exit") ) {flag = false.out.println ( "클라이언트는 더 이상 플레이하고 싶지 않습니다!")} else {system.out.println ( "클라이언트 :" + line);}} 마침내 {client { client {client .close ();}} 마지막으로 {server.close ();}}}
고객
패키지 소켓; import java.util.scanner {public static void main (string aregs) . CIN. NextLine (); output.println (system.out.println;} cin.close ();} 마침내 {client.close ()}}}. }}}}}}서버 바인딩 IP
C를 사용하여 소켓을 작성할 때 Spruct Sockaddr_in 구조는 sin_addr.s_addr을 지정할 수 있습니다. 즉, IP 주소를 지정할 수 있습니다.
내 LO 및 WLAN0이 서버에서 열린 NGINX 가상 호스트를 사용하고 있기 때문에 ETH0 네트워크 카드의 IP 주소를 바인딩 할 수 있습니다.
계획
서버 소켓의 생성자는 다음과 같습니다.
공개 서버 소켓 (int port, intaddddress bindddr)은 ioexception을 던졌습니다
매개 변수 :
포트 -로컬 TCP 포트
백 로그 -백 로그에 리스트닝
BindAddr- 서버에 의해 부드럽게됩니다
inetAddress에는 생성자가 없기 때문에 여기에 stackoverflow를 확인했습니다.
예를 들어 코드
Indadress bindip = inetAddress.getByName ( "192.168.1.168");
동시 액세스
이 서버는 다중 스레드 요청을 동시에 추가합니다.
서버 코드
CAPITALSOCKE는 java.io.inputStreamReast를 가져옵니다 static int clientNum = 0; public static void main (string args []) 예외 {serversocket theversocket me ( "192.168.1.168"); ), CAINCICERVER.CLOSE ++); (Socket S, int id) {this.client = s; id = id;} {buffer edreader input = new BufferedReader (this intputStreamReamreader (this .client.getInputStream ()); {String data = input.readline (); if (data.equals ( "bye") {system.out.println ( "current" + this.id + + "클라이언트를 재생하고 싶지 않습니다!" break;} else {system.out.println ( "current" + this.id + "said :" + data) {e.printstacktrace (); ;} catch (ioexception e) {e.printstacktrace ();}}}}}}}}}}}
클라이언트 코드 클라이언트 코드는 기본적으로 변경되지 않았으므로 종료 작업이 추가되었습니다.
CAPITALSOCKE는 Java.net.socket import java.util.scanner; 1.168 ", 9898); try {printwriter output = new PrintWriter (client.getoutPutStream (), true); 스캐너 CIN = 새 스캐너 (System.In); 문자열 단어; Nextline (); output.println (단어); } 마침내 {client.close ();}}}