네트워크 응용 프로그램은 클라이언트와 서버의 두 부분으로 나뉩니다. 소켓 클래스는 클라이언트 커뮤니케이션을 처리하는 Java 클래스입니다. 이 클래스를 통해 지정된 IP 또는 도메인 이름으로 서버에 연결할 수 있으며 서버로 서로 데이터를 보내고받을 수 있습니다. 소켓 클래스의 사용은이 기사에서 자세히 설명하고 소켓 클래스 기본 사항, 다양한 연결 방법, GET 및 SET Methods, 연결 중 시간 초과 및 폐쇄 네트워크 연결 등을 포함하여 여러 기사에서 자세히 설명합니다.
이 기사에서는 소켓 클래스 사용의 기본 단계와 방법에 대해 논의 할 것입니다. 일반적으로 네트워크 클라이언트 프로그램은 서비스 프로그램에 연결할 때 다음 세 단계를 수행해야합니다.
1. 서버에 연결하십시오
클라이언트는 두 가지 방법으로 서버에 연결할 수 있으며, 하나는 IP를 통해 서버에 연결하고 다른 하나는 도메인 이름을 통해 서버에 연결하는 것입니다.
실제로이 두 가지 방법은 본질적으로 한 가지 방법입니다. 기본 클라이언트에서는 모두 IP를 통해 서버에 연결하지만 두 방법에는 특정 차이가 있습니다. 서버 프로그램이 IP를 통해 연결된 경우 클라이언트는 단순히 IP에 따라 연결됩니다. 서버가 도메인 이름을 통해 연결된 경우 클라이언트는 도메인 이름을 DNS를 통해 IP로 해결 한 다음이 IP에 따라 연결해야합니다.
도메인 이름을 사용하여 서버에 연결할 때 많은 프로그래밍 언어 또는 개발 도구 (예 : C/C ++, Delphi)에서 먼저 도메인 이름을 IP로 해결 한 다음 IP를 통해 연결해야합니다. Java에서는 도메인 이름 해상도 기능이 소켓 클래스에 포함되었습니다. 따라서 IP 사용과 같은 도메인 이름 만 사용하면됩니다.
소켓 클래스를 통해 서버 프로그램에 연결하는 가장 일반적인 방법은 IP 또는 도메인 이름과 포트 번호를 소켓 클래스 생성자를 통해 소켓 클래스로 전달하는 것입니다. 소켓 클래스의 생성자에는 많은 과부하 형식이 있습니다. 이 섹션에서는 가장 일반적으로 사용되는 형태 중 하나만 논의됩니다 : 공개 소켓 (String Host, Int Port). 이 생성자의 정의에서 IP 또는 도메인 이름과 포트 번호를 생성자로 직접 전달하면됩니다. 다음 코드는 서버 프로그램에 연결하는 예제 프로그램입니다.
패키지 MySocket; java.net.*; public class myConnection {public static void main (String [] args) {try {if (args.length> 0) {Socket Socket = New Socket (args [0], 80); System.out.println (Args [0] + "성공적으로 연결되었습니다!"); } else system.out.println ( "IP 또는 도메인 이름을 지정하십시오!"); } catch (예외 e) {System.err.println ( "오류 메시지 :" + e.getMessage ()); }}} 위에서, IP 또는 도메인 이름은 명령 줄 매개 변수를 통해 프로그램에 전달 된 다음 명령 줄 매개 변수를 통해 지정된 IP 또는 도메인 이름의 80 포트가 소켓 소켓 = 새 소켓을 통해 연결됩니다 (Args [0], 80). 소켓 클래스 생성자는 정의 할 때 던지기를 사용하기 때문에 소켓 클래스 생성자를 호출 할 때 시도를 사용하여 ... 캐치 명령문을 사용하여 오류를 잡거나 던지기 명령문을 사용하여 기본 함수에 대한 오류를 던져야합니다.
소켓 클래스를 사용하여 서버에 연결하여 호스트에서 열리는 포트를 결정하십시오. 다음 코드는이 컴퓨터에서 포트가 열리는 스캔을하는 프로그램입니다.
2. 데이터를 보내고받습니다
소켓 클래스에서 가장 중요한 두 가지 방법은 getInputStream과 GetOutputStream입니다. 이 두 가지 방법은 데이터를 읽고 쓰기 위해 각각 입력 스트림 및 출력 스트림 객체를 얻는 데 사용됩니다. 여기에서 InputStream은 서버 프로그램에서 클라이언트에 보낸 데이터를 읽고 OutputStream은 클라이언트가 서버 프로그램으로 보내고 자하는 데이터입니다.
실제 네트워크 클라이언트 프로그램을 작성할 때 GetInputStream 또는 GetoutPutStream 사용 여부와 먼저 사용 해야하는 사람과 나중에 사용하는 사람은 특정 응용 프로그램에 의해 결정됩니다. 예를 들어, 포스트 및 텔레 커뮤니케이션 프레스 웹 사이트 (www.pppress.com.cn)의 80 포트 (일반적으로 HTTP 프로토콜에서 사용하는 기본 포트)에 연결하고 문자열을 보내고 마지막으로 www.prpress.com.cn에서 반환 된 정보를 읽습니다.
패키지 mySocket; import java.net.*; import java.io.*; public class myConnection2 {public static void main (String [] args)은 예외 {Socket Socket = new Socket ( "www.pppress.com.cn", 80); // 서버 프로그램으로 데이터를 전송합니다 outputStream ops = socket.getOutputStream (); outputStreamwriter opsw = New OutputStreamWriter (OPS); 버퍼링 라이터 BW = 새로운 버퍼링 라이터 (OPSW); bw.write ( "hello world/r/n/r/n"); bw.flush (); // 서버 프로그램에서 데이터를 수신합니다. inputStream ips = socket.getInputStream (); inputStreamReader IPSR = 새로운 입력 스트리 프 리조더 (ips); bufferedReader br = new bufferedReader (iPSR); 문자열 s = ""; while ((s = br.readline ())! = null) system.out.println (s); socket.close (); }} 위 코드를 작성할 때 다음 두 가지 점에주의를 기울여야합니다.
1. 데이터 전송의 효율성을 향상시키기 위해 소켓 클래스는 쓰기 메소드가 호출 될 때마다 데이터를 전송하지 않지만 버퍼로 전송할 데이터 (기본값은 8192 바이트)를 작성한 다음 플러시 방법을 통해이 버퍼의 데이터를 함께 보냅니다. 따라서 bw.flush (); 필요합니다.
2. 문자열을 보낼 때 "/r/n/r/n"이 Hello World 이후에 "/r/n/r/n"이 추가되는 이유는 HTTP 프로토콜 헤더가 "/r/n/r/n"을 엔드 플래그로 사용하기 때문입니다 (HTTP 프로토콜의 자세한 내용은 나중에 설명됩니다). 따라서 문자열을 전송 한 후 "/r/n/r/n"을 추가함으로써 서버 프로그램은 HTTP 헤더가 종료되어 처리 될 수 있다고 생각할 수 있습니다. "/r/n/r/n"이 추가되지 않으면 서버 프로그램이 HTTP 헤더의 끝을 기다립니다. 즉 "/r/n/r/n". 그렇다면 서버 프로그램은 클라이언트에 응답 정보를 보내지 않으며 Br.readline ()은 연결 시간이 초과 될 때까지 응답 정보를 읽을 수 없으므로 차단됩니다.
3. 네트워크 연결을 끕니다
지금까지 우리는 소켓 클래스의 기본 사용 방법에 대한 예비 이해를 가지고 있지만 소켓 클래스가 데이터를 처리 한 후 가장 합리적인 결말 방법은 소켓 클래스의 가까운 방법을 사용하여 네트워크 연결을 닫는 것입니다. 가까운 방법이 사용되었지만 네트워크 연결을 닫는 방법은 단순한 방법이 아닙니다. Java가 네트워크 연결을 종료 할 수있는 상황에서 어떤 상황을 살펴 보겠습니다.
네트워크 연결을 닫을 수있는 4 가지 상황이 있습니다.
이 4 가지 방법이 모두 동일한 목표를 달성 할 수 있지만 첫 번째 또는 두 번째 방법을 사용하여 네트워크 연결을 닫는 것이 가장 좋습니다. 세 번째 및 네 번째 방법은 일반적으로 네트워크 연결을 즉시 닫지 않기 때문입니다. 그렇다면 일부 애플리케이션의 경우 많은 쓸모없는 네트워크 연결이 남아있어 많은 양의 시스템 리소스를 차지할 것입니다.
소켓 객체가 닫힌 후에는 Isplosed 방법을 사용하여 소켓 객체가 닫힌 상태인지 여부를 결정할 수 있습니다. 그러나, 이행 된 방법을 사용하여 반환되는 것은 소켓 객체의 현재 상태입니다. 즉, 소켓 객체가 성공적으로 연결되었는지 여부에 관계없이 Isclosde는 폐쇄 상태에있는 한 TRUE를 반환합니다. 연결되지 않은 소켓 객체를 만드는 경우 isclose도 True를 반환합니다. 다음 코드에서 볼 수 있듯이 False는 출력이됩니다.
Socket Socket = New Socket (); System.out.println (socket.isclosed ());
소켓 클래스는 isclose 방법 외에도 소켓 객체가 성공적으로 연결되어 있는지 여부를 결정하는 isconnected 방법을 가지고 있습니다. 이 이름을 볼 때 독자는 오해 할 수 있습니다. 실제로, isconnected 메소드는 소켓 객체의 현재 연결 상태가 아니라 소켓 객체가 성공적으로 연결되었는지 여부를 결정합니다. 성공적으로 연결된 경우, Isclose가 지금 사실을 반환하더라도 IsConnected는 여전히 TRUE를 반환합니다. 따라서, 현재 소켓 객체가 연결된 상태인지 여부를 결정하기 위해, isclose 및 isconnected 메소드를 동시에 사용해야합니다. 다음 코드는 위의 소켓 객체의 다양한 상태의 생성 프로세스를 보여줍니다.
패키지 mySocket; import java.net.*; public class mycloseConnection {public static void printstate (소켓 소켓, 문자열 이름) {system.out.println (name + ".isclosed () :" + socket.isclosed ()); System.out.println (name + ".isconnected () :" + socket.isconnected ()); if (socket.isclosed () == false && socket.isconnected () == true) system.out.println (name + "in connected state!"); else system.out.println (이름 + "연결되지 않은 상태에서!"); System.out.println (); } public static void main (string [] args)은 예외 {socket socket1 = null, socket2 = null; Socket1 = 새로운 소켓 ( "www.ptpress.com.cn", 80); printstate (socket1, "socket1"); socket1.getoutputStream (). Close (); printstate (socket1, "socket1"); socket2 = 새로운 소켓 (); printstate (socket2, "socket2"); socket2.close (); printstate (socket2, "socket2"); }} 위 코드를 실행하면 다음 출력이 표시됩니다.
socket1.isclosed () : false
socket1.isconnected () : true
Socket1은 연결된 상태에 있습니다!
socket1.isclosed () : true
socket1.isconnected () : true
Socket1은 연결되지 않은 상태에 있습니다!
socket2.isclosed () : false
socket2.isconnected () : false
Socket2는 연결되지 않은 상태에 있습니다!
socket2.isclosed () : true
socket2.isconnected () : false
Socket2는 연결되지 않은 상태에 있습니다!
출력 결과에서 Socket1의 출력 스트림이 닫힌 후 Socket1도 자동으로 닫혀 있음을 알 수 있습니다. 위의 코드에서는 서버에 연결되지 않은 소켓 객체 Socket2의 경우, ITSMOSS 메소드가 False임을 알 수 있습니다. Socket2 Isclosed 메소드가 true를 반환하면 Socket2.close를 사용하여 닫기 메소드를 표시해야합니다.
대부분의 경우 소켓 클래스 또는 입력 및 출력 스트림의 닫기 메소드를 사용하여 네트워크 연결을 닫을 수 있습니다. 때로는 출력 스트림 또는 입력 스트림 만 닫으려면 입력 및 출력 스트림을 닫는 동안 네트워크 연결을 닫지 않습니다. 이를 위해서는 소켓 클래스의 다른 두 가지 방법 인 ShutdownInput 및 ShutdownOutput을 사용해야합니다. 이 두 가지 방법은 해당 입력 및 출력 스트림 만 닫지 만 동시에 네트워크 연결을 닫는 기능은 없습니다. 등장하고 연결된 방법과 마찬가지로 소켓 클래스는 소켓 객체의 입력 및 출력 스트림이 닫혀 있는지 여부를 결정하는 두 가지 방법을 제공합니다. 이 두 가지 방법은 isinputshutdown () 및 isoutputshutdown ()입니다. 다음 코드는 입력 및 출력 스트림 만 닫는 프로세스를 보여줍니다.
패키지 mySocket; import java.net.*; public class mycloseConnection1 {public static void printstate (socket socket) {system.out.println ( "isinputshutdown :" + socket.isinputshutdown ()); System.out.println ( "isoutputshutdown :" + socket.isoutputshutdown ()); System.out.println ( "isclosed :" + socket.isclosed ()); System.out.println (); } public static void main (String [] args)은 예외 {socket socket = new Socket ( "www.ptpress.com.cn", 80); PrintState (소켓); socket.shutdownInput (); PrintState (소켓); socket.shutdownoutput (); PrintState (소켓); }} 위 세대를 실행하면 다음과 같은 출력을 얻을 수 있습니다.
isinputshutdown : 거짓
isoutputshutdown : false
Isplosed : False
ISINPUTSHUTDOW : True
isoutputshutdown : false
Isplosed : False
ISINPUTSHUTDOW : True
isoutputshutdown : true
Isplosed : False
출력 결과에서, 우리는 Isplosed 메소드가 항상 False를 반환한다는 것을 알 수 있으므로 ShutdownPut 및 ShutdownOutput이 소켓 객체의 상태에 영향을 미치지 않음을 확신합니다.
이 기사가 도움이되기를 바랍니다. Java는 소켓 클래스를 사용하여 데이터 컨텐츠를 수신하고 보내는 것입니다. 모두가 우리 웹 사이트를 계속 따르기를 바랍니다! Java를 배우고 싶다면이 웹 사이트를 계속 팔로우 할 수 있습니다.