English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
네트워크 프로그래밍은 여러 장치(컴퓨터)에서 실행되는 프로그램을 작성하는 것을 의미하며, 이 장치들은 네트워크를 통해 연결되어 있습니다.
java.net 패키지에 J2SE의 API 패키지는 클래스와 인터페이스를 포함하고 있으며, 이는 저级别의 통신 세부 사항을 제공합니다. 이러한 클래스와 인터페이스를 사용하여 통신 세부 사항에 대해 신경 쓰지 않고 문제를 해결할 수 있습니다.
java.net 패키지는 두 가지 일반적인 네트워크 프로토콜을 지원합니다:
TCP:TCP(영어:Transmission Control Protocol,전송 제어 프로토콜)은 연결을 기반으로 한, 신뢰성이 있는, 바이트 스트림 기반의 전송층 통신 프로토콜입니다. TCP 층은 IP 층 위에 있고, 애플리케이션 층 아래에 있는 중간 층입니다. TCP는 두 애플리케이션 간의 신뢰성 있는 통신을 보장합니다. 일반적으로 인터넷 프로토콜로 사용되며 TCP로 알려져 있습니다. / IP.
UDP:UDP(영어:User Datagram Protocol,사용자 데이터그램 프로토콜)은 OSI 모델의 전송층에 위치한 비연결 프로토콜입니다. 애플리케이션 간에 전송할 데이터 패킷을 제공합니다. UDP는 신뢰성이 부족하고 비연결 프로토콜이므로, 애플리케이션은 일부 패킷의 손실, 오류 또는 중복을 용인해야 합니다.
이 튜토리얼은 다음 두 주제를 주로 설명합니다.
소켓 프로그래밍:이는 가장 널리 사용되는 네트워크 개념으로 매우 자세히 설명되었습니다.
URL 처리:이 부분은 다른 장에서 설명할 예정입니다. 더 자세히 알고 싶으면 여기를 클릭하세요. Java 언어의 URL 처리
소켓은 TCP를 사용하여 두 컴퓨터 간의 통신 메커니즘을 제공합니다. 클라이언트 프로그램은 소켓을 생성하고 서버 소켓에 연결을 시도합니다.
연결이 설정되면 서버는 Socket 객체를 생성합니다. 클라이언트와 서버는 이제 Socket 객체에 대한 입력과 출력을 통해 통신할 수 있습니다.
java.net.Socket 클래스는 소켓을 대표하며, java.net.ServerSocket 클래스는 서버 프로그램이 클라이언트를 감지하고与他们를 연결하는 메커니즘을 제공합니다.
다음 단계는 두 컴퓨터 간에 소켓을 사용하여 TCP 연결을 설정할 때 발생합니다:
서버는 서버에서 포트를 통해 통신하는 ServerSocket 객체를 인스턴스화합니다.
서버는 ServerSocket 클래스의 accept() 메서드를 호출하여, 클라이언트가 서버에 지정된 포트에 연결될 때까지 기다립니다.
서버가 기다리는 동안 클라이언트는 서버 이름과 포트 번호를 지정하여 연결을 요청하는 Socket 객체를 인스턴스화합니다.
Socket 클래스의 생성자는 클라이언트가 지정된 서버와 포트에 연결되도록 시도합니다. 통신이 성립되면, 클라이언트는 서버와 통신할 수 있는 Socket 객체를 생성할 수 있습니다.
서버 측에서는 accept() 메서드가 서버에서 새로운 소켓 참조를 반환하며, 이 소켓은 클라이언트의 소켓에 연결됩니다.
연결이 성립되면, I를 사용하여/O 스트림이 통신할 때마다 소켓은 하나의 출력 스트림과 하나의 입력 스트림을 가지며, 클라이언트의 출력 스트림은 서버의 입력 스트림에 연결되고, 클라이언트의 입력 스트림은 서버의 출력 스트림에 연결됩니다.
TCP는 양방향 통신 프로토콜이므로, 두 데이터 스트림을 동시에 데이터를 전송할 수 있습니다. 다음은 소켓을 구현하는 데 사용할 수 있는 일련의 유용한 메서드를 제공하는 클래스입니다.
서버 애플리케이션은 java.net.ServerSocket 클래스를 사용하여 포트를 가져오고 클라이언트 요청을 감지합니다.
ServerSocket 클래스는 네 가지 생성자를 가지고 있습니다:
순번 | 메서드 설명 |
1 | public ServerSocket(int port) throws IOException 지정된 포트에 바인딩된 서버 소켓을 생성합니다. |
2 | public ServerSocket(int port, int backlog) throws IOException 지정된 백로그를 사용하여 서버 소켓을 생성하고 지정된 로컬 포트에 바인딩합니다. |
3 | public ServerSocket(int port, int backlog, InetAddress address) throws IOException 지정된 포트, 리스닝 백로그 및 바인딩할 로컬 IP 주소를 사용하여 서버를 생성합니다. |
4 | public ServerSocket() throws IOException 비바인딩 서버 소켓을 생성합니다. |
비바인딩 서버 소켓을 생성합니다. ServerSocket 생성자가 예외를 발생시키지 않으면, 애플리케이션이 지정된 포트에 성공적으로 바인딩되었음을 의미합니다. 이제 클라이언트 요청을 기다릴 수 있습니다.
ServerSocket 클래스의 일반적인 메서드가 여기에 있습니다:
순번 | 메서드 설명 |
1 | public int getLocalPort() 이 소켓이 듣고 있는 포트 번호를 반환합니다. |
2 | public Socket accept() throws IOException 이 소켓에 대한 연결을 기다리고 수락합니다. |
3 | public void setSoTimeout(int timeout) 지정된 타임아웃 값으로 활성화/SO_TIMEOUT을 미리 설정합니다. |
4 | public void bind(SocketAddress host, int backlog) ServerSocket을 특정 주소(IP 주소와 포트 번호)에 바인딩합니다. |
java.net.Socket 클래스는 클라이언트와 서버가 상호 통신을 위해 사용하는 소켓을 대표합니다. 클라이언트는 예제화를 통해 Socket 객체를 얻고, 서버는 accept() 메서드의 반환 값으로 Socket 객체를 얻습니다.
Socket 클래스는 다섯 가지 생성자를 가지고 있습니다.
순번 | 메서드 설명 |
1 | public Socket(String host, int port) throws UnknownHostException, IOException. 지정된 호스트의 지정된 포트 번호에 연결된 스트림 소켓을 생성합니다. |
2 | public Socket(InetAddress host, int port) throws IOException 지정된 IP 주소의 지정된 포트 번호에 연결된 스트림 소켓을 생성합니다. |
3 | public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. 소켓을 생성하고 지정된 원격 호스트의 지정된 원격 포트에 연결합니다. |
4 | public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. 지정된 원격 주소에 있는 지정된 원격 포트에 연결된 소켓을 생성합니다. |
5 | public Socket() 시스템 기본类型的 SocketImpl을 통해 연결되지 않은 소켓을 생성합니다 |
Socket 생성자가 반환되면, 간단한 예제로 Socket 객체를 시뮬레이션한 것처럼 보이지만, 실제로는 지정된 서버와 포트에 연결을 시도합니다.
다음은 관심 있는 메서드를 나열합니다. 클라이언트와 서버 모두가 Socket 객체를 가지고 있으므로, 클라이언트와 서버 모두가 이 메서드를 호출할 수 있습니다.
순번 | 메서드 설명 |
1 | public void connect(SocketAddress host, int timeout) throws IOException 이 소켓을 서버에 연결하고 타임아웃 값을 지정합니다. |
2 | public InetAddress getInetAddress() 소켓이 연결된 주소를 반환합니다. |
3 | public int getPort() 이 소켓이 연결된 원격 포트를 반환합니다. |
4 | public int getLocalPort() 이 소켓이 바인딩된 로컬 포트를 반환합니다. |
5 | public SocketAddress getRemoteSocketAddress() 소켓이 연결되어 있지 않으면 null을 반환하는 소켓 연결의 원격 주소를 반환합니다. |
6 | public InputStream getInputStream() throws IOException 이 소켓의 입력 스트림을 반환합니다. |
7 | public OutputStream getOutputStream() throws IOException 이 소켓의 출력 스트림을 반환합니다. |
8 | public void close() throws IOException 이 소켓을 닫습니다. |
이 클래스는 인터넷 프로토콜(IP) 주소를 나타냅니다. 소켓 프로그래밍에서 유용한 메서드는 다음과 같습니다:
순번 | 메서드 설명 |
1 | static InetAddress getByAddress(byte[] addr) 주어진 원래 IP 주소의 경우 InetAddress 객체를 반환합니다. |
2 | static InetAddress getByAddress(String host, byte[] addr) 제공된 호스트 이름과 IP 주소로 InetAddress를 생성합니다. |
3 | static InetAddress getByName(String host) 주어진 호스트 이름에 대해 호스트의 IP 주소를 확인합니다. |
4 | String getHostAddress() IP 주소 문자열(텍스트 형식)을 반환합니다. |
5 | String getHostName() 이 IP 주소의 호스트 이름을 가져옵니다. |
6 | static InetAddress getLocalHost() 로컬 호스트를 반환합니다. |
7 | String toString() 이 IP 주소를 String으로 변환합니다. |
다음의 GreetingClient는 클라이언트 프로그램으로서, 서버에 소켓을 통해 연결하여 요청을 보내고 응답을 기다리는 프로그램입니다.
// 파일 이름 GreetingClient.java import java.net.*; import java.io.*; public class GreetingClient { public static void main(String [] args) { String serverName = args[0]; 1] try { System.out.println("호스트에 연결됨: "} + serverName + ", 포트 번호: "} + port); Socket client = new Socket(serverName, port); System.out.println("远程主机地址:" + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from "); + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("서버 응답: "} + in.readUTF()); client.close(); }catch(IOException e) { e.printStackTrace(); } } }
다음의 GreetingServer 프로그램은 특정 포트를 모니터링하는 서버 애플리케이션입니다.
// 파일 이름 GreetingServer.java import java.net.*; import java.io.*; public class GreetingServer extends Thread { private ServerSocket serverSocket; public GreetingServer(int port) throws IOException { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); } public void run() { while(true) { try { System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...); Socket server = serverSocket.accept(); System.out.println("远程主机地址:" + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!"); server.close(); }catch(SocketTimeoutException s) { System.out.println("Socket timed out!"); break; }catch(IOException e) { e.printStackTrace(); break; } } } public static void main(String [] args) { int port = Integer.parseInt(args[0]); try { Thread t = new GreetingServer(port); t.run(); }catch(IOException e) { e.printStackTrace(); } } }
위의 두 개의 java 파일을 컴파일하고 다음 명령을 실행하여 서비스를 시작합니다. 사용할 포트 번호는 6066:
$ javac GreetingServer.java $ java GreetingServer 6066 원격 연결을 기다립니다. 포트 번호는:6066...
새로운 명령 프롬프트 창을 엽니다. 위의 명령을 실행하여 클라이언트를 시작합니다:
$ javac GreetingClient.java $ java GreetingClient localhost 6066 호스트에 연결됨:localhost ,포트 번호:6066 원격 호스트 주소:localhost/127.0.0.1:6066 서버 응답: 감사합니다. 연결해 주셨습니다:/127.0.0.1:6066 안녕히 가세요!