자바-네트워킹

네트워크 프로그래밍 이라는 용어 는 여러 장치 (컴퓨터)에서 실행되는 프로그램을 작성하는 것을 의미하며, 여기서 장치는 모두 네트워크를 사용하여 서로 연결됩니다.

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!