자바-네트워킹
네트워크 프로그래밍 이라는 용어 는 여러 장치 (컴퓨터)에서 실행되는 프로그램을 작성하는 것을 의미하며, 여기서 장치는 모두 네트워크를 사용하여 서로 연결됩니다.
J2SE API의 java.net 패키지에는 저수준 통신 세부 정보를 제공하는 클래스 및 인터페이스 모음이 포함되어있어 당면한 문제 해결에 초점을 맞춘 프로그램을 작성할 수 있습니다.
java.net 패키지는 두 가지 공통 네트워크 프로토콜을 지원합니다.
TCP− TCP는 전송 제어 프로토콜 (Transmission Control Protocol)을 나타내며 두 애플리케이션 간의 안정적인 통신을 허용합니다. TCP는 일반적으로 TCP / IP라고하는 인터넷 프로토콜을 통해 사용됩니다.
UDP − UDP는 애플리케이션간에 데이터 패킷을 전송할 수있는 비 연결형 프로토콜 인 사용자 데이터 그램 프로토콜을 의미합니다.
이 장에서는 다음 두 가지 주제에 대해 잘 이해하고 있습니다.
Socket Programming − 이것은 네트워킹에서 가장 널리 사용되는 개념이며 매우 자세하게 설명되었습니다.
URL Processing− 이것은 별도로 다룹니다. Java 언어의 URL 처리 에 대해 알아 보려면 여기를 클릭하십시오 .
소켓 프로그래밍
소켓은 TCP를 사용하는 두 컴퓨터 간의 통신 메커니즘을 제공합니다. 클라이언트 프로그램은 통신 끝에 소켓을 만들고 해당 소켓을 서버에 연결하려고합니다.
연결이 이루어지면 서버는 통신 끝에 소켓 개체를 만듭니다. 이제 클라이언트와 서버는 소켓에 쓰고 읽음으로써 통신 할 수 있습니다.
java.net.Socket 클래스는 소켓을 나타내고 java.net.ServerSocket 클래스는 서버 프로그램이 클라이언트를 수신하고 클라이언트와 연결을 설정하는 메커니즘을 제공합니다.
다음 단계는 소켓을 사용하여 두 컴퓨터 사이에 TCP 연결을 설정할 때 발생합니다-
서버는 ServerSocket 개체를 인스턴스화하여 통신이 발생할 포트 번호를 나타냅니다.
서버는 ServerSocket 클래스의 accept () 메소드를 호출합니다. 이 메소드는 클라이언트가 주어진 포트에서 서버에 연결할 때까지 기다립니다.
서버가 대기 한 후 클라이언트는 연결할 서버 이름과 포트 번호를 지정하여 Socket 개체를 인스턴스화합니다.
Socket 클래스의 생성자는 클라이언트를 지정된 서버와 포트 번호에 연결하려고합니다. 통신이 설정되면 클라이언트는 이제 서버와 통신 할 수있는 Socket 개체를 갖게됩니다.
서버 측에서 accept () 메서드는 클라이언트의 소켓에 연결된 서버의 새 소켓에 대한 참조를 반환합니다.
연결이 설정되면 I / O 스트림을 사용하여 통신 할 수 있습니다. 각 소켓에는 OutputStream과 InputStream이 모두 있습니다. 클라이언트의 OutputStream은 서버의 InputStream에 연결되고 클라이언트의 InputStream은 서버의 OutputStream에 연결됩니다.
TCP는 양방향 통신 프로토콜이므로 두 스트림을 통해 동시에 데이터를 전송할 수 있습니다. 다음은 소켓을 구현하는 완전한 메소드 세트를 제공하는 유용한 클래스입니다.
ServerSocket 클래스 메서드
그만큼 java.net.ServerSocket 클래스는 서버 응용 프로그램에서 포트를 얻고 클라이언트 요청을 수신하는 데 사용됩니다.
ServerSocket 클래스에는 4 개의 생성자가 있습니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | public ServerSocket(int port) throws IOException 지정된 포트에 바인딩 된 서버 소켓을 만들려고합니다. 포트가 이미 다른 애플리케이션에 의해 바인드 된 경우 예외가 발생합니다. |
2 | public ServerSocket(int port, int backlog) throws IOException 이전 생성자와 유사하게 backlog 매개 변수는 대기 큐에 저장할 수신 클라이언트 수를 지정합니다. |
삼 | public ServerSocket(int port, int backlog, InetAddress address) throws IOException 이전 생성자와 마찬가지로 InetAddress 매개 변수는 바인딩 할 로컬 IP 주소를 지정합니다. InetAddress는 여러 IP 주소를 가질 수있는 서버에 사용되므로 서버가 클라이언트 요청을 수락 할 IP 주소를 지정할 수 있습니다. |
4 | public ServerSocket() throws IOException 바인딩되지 않은 서버 소켓을 만듭니다. 이 생성자를 사용할 때 서버 소켓을 바인딩 할 준비가되면 bind () 메서드를 사용하십시오. |
ServerSocket 생성자가 예외를 throw하지 않으면 애플리케이션이 지정된 포트에 성공적으로 바인딩되었으며 클라이언트 요청을받을 준비가되었음을 의미합니다.
다음은 ServerSocket 클래스의 일반적인 방법 중 일부입니다-
Sr. 아니. | 방법 및 설명 |
---|---|
1 | public int getLocalPort() 서버 소켓이 수신하는 포트를 반환합니다. 이 메서드는 생성자에서 포트 번호로 0을 전달하고 서버가 포트를 찾도록하는 경우 유용합니다. |
2 | public Socket accept() throws IOException 들어오는 클라이언트를 기다립니다. 이 메서드는 클라이언트가 지정된 포트에서 서버에 연결하거나 소켓이 시간 초과 될 때까지 차단되며, setSoTimeout () 메서드를 사용하여 시간 초과 값이 설정되었다고 가정합니다. 그렇지 않으면이 메서드는 무기한 차단됩니다. |
삼 | public void setSoTimeout(int timeout) accept () 동안 서버 소켓이 클라이언트를 기다리는 시간 제한 값을 설정합니다. |
4 | public void bind(SocketAddress host, int backlog) 소켓을 SocketAddress 개체의 지정된 서버 및 포트에 바인딩합니다. 인수가없는 생성자를 사용하여 ServerSocket을 인스턴스화 한 경우이 메서드를 사용합니다. |
ServerSocket이 accept ()를 호출하면 메서드는 클라이언트가 연결될 때까지 반환되지 않습니다. 클라이언트가 연결되면 ServerSocket은 지정되지 않은 포트에 새 소켓을 만들고이 새 소켓에 대한 참조를 반환합니다. 이제 클라이언트와 서버 사이에 TCP 연결이 존재하며 통신을 시작할 수 있습니다.
소켓 클래스 메서드
그만큼 java.net.Socket클래스는 클라이언트와 서버가 서로 통신하는 데 사용하는 소켓을 나타냅니다. 클라이언트는 하나를 인스턴스화하여 Socket 객체를 얻는 반면, 서버는 accept () 메서드의 반환 값에서 Socket 객체를 얻습니다.
Socket 클래스에는 클라이언트가 서버에 연결하는 데 사용하는 5 개의 생성자가 있습니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | public Socket(String host, int port) throws UnknownHostException, IOException. 이 방법은 지정된 포트에서 지정된 서버에 연결을 시도합니다. 이 생성자가 예외를 throw하지 않으면 연결이 성공하고 클라이언트가 서버에 연결됩니다. |
2 | public Socket(InetAddress host, int port) throws IOException 이 메서드는 호스트가 InetAddress 개체로 표시된다는 점을 제외하면 이전 생성자와 동일합니다. |
삼 | 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. 이 메서드는 호스트가 String 대신 InetAddress 개체로 표시된다는 점을 제외하면 이전 생성자와 동일합니다. |
5 | public Socket() 연결되지 않은 소켓을 만듭니다. connect () 메서드를 사용하여이 소켓을 서버에 연결합니다. |
Socket 생성자가 반환되면 단순히 Socket 객체를 인스턴스화하는 것이 아니라 실제로 지정된 서버 및 포트에 연결을 시도합니다.
Socket 클래스와 관련된 몇 가지 방법이 여기에 나열되어 있습니다. 클라이언트와 서버에는 모두 Socket 개체가 있으므로 이러한 메서드는 클라이언트와 서버 모두에서 호출 할 수 있습니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | public void connect(SocketAddress host, int timeout) throws IOException 이 메서드는 소켓을 지정된 호스트에 연결합니다. 이 메서드는 인수가없는 생성자를 사용하여 Socket을 인스턴스화 할 때만 필요합니다. |
2 | public InetAddress getInetAddress() 이 메서드는이 소켓이 연결된 다른 컴퓨터의 주소를 반환합니다. |
삼 | public int getPort() 원격 시스템에서 소켓이 바인딩 된 포트를 반환합니다. |
4 | public int getLocalPort() 소켓이 로컬 시스템에서 바인딩 된 포트를 반환합니다. |
5 | public SocketAddress getRemoteSocketAddress() 원격 소켓의 주소를 반환합니다. |
6 | public InputStream getInputStream() throws IOException 소켓의 입력 스트림을 반환합니다. 입력 스트림은 원격 소켓의 출력 스트림에 연결됩니다. |
7 | public OutputStream getOutputStream() throws IOException 소켓의 출력 스트림을 반환합니다. 출력 스트림은 원격 소켓의 입력 스트림에 연결됩니다. |
8 | public void close() throws IOException 소켓을 닫으면이 Socket 객체가 더 이상 서버에 다시 연결할 수 없게됩니다. |
InetAddress 클래스 메서드
이 클래스는 인터넷 프로토콜 (IP) 주소를 나타냅니다. 다음은 소켓 프로그래밍을하는 동안 필요한 유용한 방법입니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | static InetAddress getByAddress(byte[] addr) 원시 IP 주소가 지정된 InetAddress 개체를 반환합니다. |
2 | static InetAddress getByAddress(String host, byte[] addr) 제공된 호스트 이름 및 IP 주소를 기반으로 InetAddress를 만듭니다. |
삼 | static InetAddress getByName(String host) 호스트 이름이 주어지면 호스트의 IP 주소를 결정합니다. |
4 | String getHostAddress() 텍스트 표현으로 IP 주소 문자열을 반환합니다. |
5 | String getHostName() 이 IP 주소의 호스트 이름을 가져옵니다. |
6 | static InetAddress InetAddress getLocalHost() 로컬 호스트를 반환합니다. |
7 | String toString() 이 IP 주소를 문자열로 변환합니다. |
소켓 클라이언트 예
다음 GreetingClient는 소켓을 사용하여 서버에 연결하여 인사말을 보낸 다음 응답을 기다리는 클라이언트 프로그램입니다.
예
// File Name GreetingClient.java
import java.net.*;
import java.io.*;
public class GreetingClient {
public static void main(String [] args) {
String serverName = args[0];
int port = Integer.parseInt(args[1]);
try {
System.out.println("Connecting to " + serverName + " on port " + port);
Socket client = new Socket(serverName, port);
System.out.println("Just connected to " + 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("Server says " + in.readUTF());
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
소켓 서버 예
다음 GreetingServer 프로그램은 Socket 클래스를 사용하여 명령 줄 인수로 지정된 포트 번호에서 클라이언트를 수신하는 서버 응용 프로그램의 예입니다.
예
// File Name 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("Waiting for client on port " +
serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("Just connected to " + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("Thank you for connecting to " + 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.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
클라이언트와 서버를 컴파일하고 다음과 같이 서버를 시작하십시오.
$ java GreetingServer 6066
Waiting for client on port 6066...
다음과 같이 클라이언트 프로그램을 확인하십시오-
산출
$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!