소켓이라고도하는 소켓은 컴퓨터 네트워크 통신을위한 기본 기술 중 하나입니다. 오늘날 브라우저, 인스턴트 메시징 도구 및 P2P 다운로드와 같은 대부분의 웹 기반 소프트웨어는 소켓을 기반으로 구현됩니다. 이 기사는 TCP/IP와 클라이언트/서버 프로그램 작성 방법을 기반으로 한 소켓 프로그래밍을 소개합니다.
저녁 식사 전 디저트
UNIX의 입력 및 출력 (IO) 시스템은 개방 판정-쓰기 클로즈와 같은 작동 템플릿을 따릅니다. 사용자 프로세스가 IO 작업을 수행하기 전에 Open 호출을 호출하여 읽거나 쓰기로 작동 할 파일 또는 장치에 대한 권한을 지정하고 얻어야합니다. IO 작동 오브젝트가 열리면 사용자 프로세스는 객체에서 하나 이상의 읽기 또는 쓰기 작업을 수행 할 수 있습니다. 읽기 작업은 IO 작동 오브젝트의 데이터를 읽고 데이터를 사용자 프로세스로 전달하는 데 사용됩니다. 쓰기 작업은 사용자 프로세스의 데이터를 IO 작업 객체에 전달하는 데 사용됩니다. 결국 읽기 및 쓰기 작업이 완료된 후에는 사용자 프로세스가 IO 객체 사용을 완료한다는 것을 시스템에 알리기 위해 가까이 호출해야합니다.
UNIX가 IPC (Intervacess Communication)를 지원하기 시작했을 때 IPC 인터페이스는 파일 IO 작동 인터페이스와 유사하도록 설계되었습니다. UNIX에서 프로세스에는 읽고 쓸 수있는 일련의 IO 디스크립터가 있습니다. IO 디스크립터는 파일, 장치 또는 통신 채널 (소켓 소켓) 일 수 있습니다. 파일 디스크립터는 세 부분으로 구성됩니다 : 소켓 생성 (오프닝 소켓), 데이터 읽기 및 쓰기 (소켓 수락 및 전송) 및 파괴 (닫는 소켓)로 구성됩니다.
UNIX 시스템에서 IPC 인터페이스의 BSD와 같은 버전은 TCP 및 UDP 프로토콜 위의 계층으로 구현됩니다. 메시지 대상은 소켓 주소로 표시됩니다. 소켓 주소는 네트워크 주소와 포트 번호로 구성된 통신 식별자입니다.
프로세스 간 통신 작업에는 한 쌍의 소켓이 필요합니다. 프로세스 간 통신은 한 프로세스에서 한 소켓과 다른 프로세스에서 다른 소켓 사이의 데이터 전송에 의해 달성됩니다. 메시지가 실행되고 전송되면, 하위 레벨 네트워크 프로토콜이 메시지를 전송할 때까지 메시지가 전송 끝의 소켓에 대기됩니다. 메시지가 수신 종료시 소켓에 도달하면 수신 종료의 프로세스가 메시지를받을 때까지 큐에 있습니다.
TCP 및 UDP 커뮤니케이션
소켓 프로그래밍과 관련하여 선택할 수있는 두 가지 통신 프로토콜이 있습니다. 하나는 데이터 그램 커뮤니케이션이고 다른 하나는 스트림 통신입니다.
데이터 그램 통신
데이터 그램 커뮤니케이션 프로토콜은 종종 UDP (사용자 데이터 프로토콜)라고 부릅니다. UDP는 연결이없는 프로토콜입니다. 즉, 데이터 그램을 보낼 때마다 기본 기계의 소켓 디스크립터와 수신기의 소켓 디스크립터를 동시에 보내야합니다. 따라서 의사 소통 할 때마다 추가 데이터를 보내야합니다.
스트림 커뮤니케이션
TCP (Transfer Control Protocol)라고도하는 스트림 통신 프로토콜을 TCP (전송 제어 프로토콜)라고도합니다. UDP와 달리 TCP는 연결 기반 프로토콜입니다. 스트림 커뮤니케이션을 사용하기 전에 커뮤니케이션 소켓 쌍간에 연결을 설정해야합니다. 소켓 중 하나는 연결 요청을 듣는 서버 역할을합니다. 다른 하나는 클라이언트로서 연결 요청을합니다. 두 소켓이 연결을 설정하면 데이터를 일방적 또는 양방향으로 전송할 수 있습니다.
이 글을 읽은 후 소켓 프로그래밍에 UDP 또는 TCP를 사용하는지에 대한 질문이 있습니다. 특정 응용 프로그램 시나리오를 기반으로하는 프로토콜을 기반으로 한 소켓 프로그래밍 선택은 특정 클라이언트 서버 프로그램에 따라 다릅니다. 아래에서는 TCP와 UDP 프로토콜의 차이를 간단히 분석하여 사용할 수있는 것을 더 잘 선택할 수 있습니다.
UDP에서는 데이터 그램이 전송 될 때마다 기본 기계의 소켓 디스크립터와 수신기의 소켓 디스크립터를 포함해야합니다. TCP는 연결 기반 프로토콜이므로 통신 전에 통신 소켓 쌍간에 연결을 설정해야하므로 TCP 프로토콜에 시간이 많이 걸리는 연결 프로그래밍이 있습니다.
UDP에서 데이터 그램 데이터의 크기는 64kb 제한입니다. TCP에는 그러한 제한이 없습니다. TCP 통신의 소켓 쌍이 연결을 설정하면 이들 사이의 통신은 IO 스트림과 유사하며 모든 데이터가 허용되는 순서대로 읽습니다.
UDP는 신뢰할 수없는 프로토콜이며, 전송 된 데이터 그램이 수신 소켓에 의해 반드시 전송 된 순서로 반드시 허용되는 것은 아닙니다. 그런 다음 TCP는 신뢰할 수있는 프로토콜입니다. 수신 끝이받은 패킷의 순서는 전송 끝의 패킷 순서와 일치합니다.
요컨대, TCP는 원격 로그인 (Rlogin, Telnet) 및 파일 전송 (FTP)과 같은 네트워크 서비스에 적합합니다. 전송 해야하는 이러한 데이터의 크기는 확실하지 않기 때문입니다. UDP는 TCP보다 간단하고 가볍습니다. UDP는 실시간 또는 패킷 손실의 중요성이없는 일부 서비스를 구현하는 데 사용됩니다. LAN에서 UDP의 패킷 손실률은 상대적으로 낮습니다.
자바의 소켓 프로그래밍
다음 섹션에서는 소켓을 사용하여 몇 가지 예를 통해 클라이언트 및 서버 프로그램을 작성하는 방법을 설명합니다.
참고 : 다음 예에서는 TCP/IP 프로토콜을 기반으로 한 소켓 프로그래밍을 사용합니다.이 프로토콜은 UDP/IP보다 훨씬 더 널리 사용되기 때문입니다. 모든 소켓 관련 클래스는 java.net 패키지 아래에 있으므로 소켓 프로그래밍을 할 때이 패키지를 소개해야합니다.
고객 쓰기
소켓을 켭니다
클라이언트쪽에있는 경우 소켓을 열려면 다음 코드를 작성해야합니다.
문자열 호스트 = "127.0.0.1"; int port = 8919; 소켓 클라이언트 = 새 소켓 (호스트, 포트);
위의 코드에서 호스트는 클라이언트가 연결 해야하는 컴퓨터이며 포트는 서버가 요청을 듣는 데 사용하는 포트입니다. 포트를 선택할 때주의를 기울여야 할 한 가지는 0 ~ 1023과 같은 포트가 시스템에 의해 예약되었다는 것입니다. 이 포트는 Mail, FTP 및 HTTP와 같은 일반적으로 사용되는 일부 서비스에서 사용됩니다. 서버 측 코드를 작성하고 포트를 선택할 때는 1023보다 큰 포트를 선택하십시오.
데이터 작성
다음은 요청 데이터를 작성하는 것입니다. 클라이언트의 소켓 객체에서 출력 스트림 객체를 얻은 다음 데이터를 작성합니다. 파일 IO 처리 코드와 매우 유사합니다.
public class clientsocket {public static void main (String args []) {문자열 호스트 = "127.0.0.1"; int port = 8919; try {Socket Client = New Socket (호스트, 포트); Writer Writer = New OutputStreamWriter (client.getoutPutStream ()); writer.write ( "클라이언트에서 Hello"); Writer.flush (); Writer.close (); client.close (); } catch (ioexception e) {e.printstacktrace (); }}}IO 객체를 닫습니다
File IO와 유사하게 데이터를 읽고 쓰고 나면 IO 객체를 닫아 올바른 리소스를 릴리스해야합니다.
서버 측 쓰기
서버 측 소켓을 엽니 다
int port = 8919; serversocket server = 새 서버 소켓 (port); socket socket = server.accrect ();
위의 코드는 서버 측 소켓을 생성 한 다음 수락 메소드를 호출하여 클라이언트의 요청 소켓을 듣고 가져옵니다. 수락 방법은 서버와 클라이언트간에 연결 될 때까지 차단을 기다리는 차단 방법입니다.
데이터를 읽습니다
위에서 얻은 소켓 객체를 통해 입력 스트림 객체를 가져온 다음 파일 IO를 설치하여 데이터를 읽으십시오. 여기서 우리는 내용을 인쇄합니다.
public class serverclient {public static void main (String [] args) {int port = 8919; try {serversocket server = new Serversocket (port); Socket Socket = Server.accept (); reader reader = new inputStreamReader (socket.getInputStream ()); char chars [] = 새로운 char [1024]; int len; StringBuilder Builder = New StringBuilder (); while ((len = reader.read (chars))! = -1) {builder.append (new String (chars, 0, len)); } system.out.println ( "클라이언트로부터 수신 = :" + builder); reader.close (); socket.close (); Server.Close (); } catch (예외 e) {e.printstacktrace (); }}}IO 객체를 닫습니다
잊을 수 없습니다. 마지막으로, 올바른 리소스의 릴리스를 보장하려면 IO 객체를 올바르게 닫아야합니다.
예를 들어주십시오
여기에 소켓을 사용하여 Echo 서버를 구현하여 서버가 클라이언트가 보낸 데이터를 클라이언트로 다시 전달합니다. 코드는 매우 간단합니다.
import java.io.*; import java.net.*; public class echoserver {public static void main (string args []) {// 선언 섹션 : // 서버의 서버 소켓 및 클라이언트 소켓 선언 // 출력 스트림 및 출력 스트림 serversocket echoserver = null; 문자열 라인; DatainputStream은; Printstream OS; Socket Clientsocket = NULL; // 포트 9999에서 서버 소켓을 열어보십시오. // // 권한이없는 사용자 (루트) 시도 {echoserver = new Serversocket (9999); } catch (ioException e) {System.out.println (e); } // serversocket에서 소켓 객체를 생성하여 청취하고 수락합니다. // 입력 및 출력 스트림 열기 {clientsocket = echoserver.accept (); is = new datainputStream (clientsocket.getInputStream ()); os = new printstream (clientsocket.getoutPutStream ()); // 데이터를 수신하는 한 해당 데이터를 클라이언트에 다시 반영하십시오. while (true) {line = is.readline (); os.println (line); }} catch (ioexception e) {System.out.println (e); }}}위의 코드를 컴파일하고 실행하고 다음 요청을 작성하면 클라이언트 요청에 의해 운반 된 데이터의 내용을 볼 수 있습니다.
15:00 $ CURL http://127.0.0.1:9999/?11GET/? 111 HTTP/1.1USER-AGENT : CURL/7.37.1HOST : 127.0.0.1:999994ACCEPT : */ *
요약
클라이언트 서버 프로그래밍을 수행하는 것은 매우 흥미롭고 Java의 소켓 프로그래밍은 다른 언어 (예 : C)보다 쉽고 빠릅니다.
Java.net 패키지에는 개발자가 네트워크를 프로그래밍 할 수있는 강력하고 유연한 클래스가 많이 포함되어 있습니다. 네트워크를 프로그래밍 할 때는이 패키지 아래의 API를 사용하는 것이 좋습니다. 동시에 Sun.* 패키지에는 많은 네트워크 프로그래밍 관련 클래스가 포함되어 있지만이 패키지가 변경 될 수 있으므로이 패키지 아래의 API를 사용하는 것이 좋습니다. 또한이 패키지를 모든 플랫폼에 포함시킬 수는 없습니다.
위는 Java 소켓 정보를 편집 한 것입니다. 우리는 향후 관련 지식을 계속 추가 할 것입니다. 이 웹 사이트를 지원 해주셔서 감사합니다!