자바-네트워킹

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

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!