산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

자바 - 네트워킹

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

J2SE API의 java.net 패키지에는 하위 수준 통신 세부 정보를 제공하는 클래스 및 인터페이스 모음이 포함되어 있어 당면한 문제 해결에 중점을 둔 프로그램을 작성할 수 있습니다.

java.net 패키지는 두 가지 공통 네트워크 프로토콜에 대한 지원을 제공합니다. -

이 장에서는 다음 두 가지 주제에 대해 잘 이해하고 있습니다. -

소켓 프로그래밍

소켓은 TCP를 사용하는 두 컴퓨터 간의 통신 메커니즘을 제공합니다. 클라이언트 프로그램은 통신 끝에 소켓을 만들고 해당 소켓을 서버에 연결하려고 시도합니다.

연결이 만들어지면 서버는 통신이 끝날 때 소켓 개체를 만듭니다. 클라이언트와 서버는 이제 소켓에 쓰고 소켓에서 읽음으로써 통신할 수 있습니다.

java.net.Socket 클래스는 소켓을 나타내며, java.net.ServerSocket 클래스는 서버 프로그램이 클라이언트를 수신 대기하고 클라이언트와 연결을 설정하는 메커니즘을 제공합니다.

소켓을 사용하여 두 컴퓨터 간에 TCP 연결을 설정할 때 다음 단계가 발생합니다. -

연결이 설정되면 I/O 스트림을 사용하여 통신할 수 있습니다. 각 소켓에는 OutputStream과 InputStream이 모두 있습니다. 클라이언트의 OutputStream은 서버의 InputStream에 연결되고 클라이언트의 InputStream은 서버의 OutputStream에 연결됩니다.

TCP는 양방향 통신 프로토콜이므로 두 스트림을 통해 동시에 데이터를 보낼 수 있습니다. 다음은 소켓을 구현하기 위한 완전한 메소드 세트를 제공하는 유용한 클래스입니다.

ServerSocket 클래스 메서드

java.net.ServerSocket 클래스는 서버 응용 프로그램에서 포트를 얻고 클라이언트 요청을 수신하는 데 사용됩니다.

ServerSocket 클래스에는 4개의 생성자가 있습니다. -

Sr.No. 방법 및 설명
1

공개 ServerSocket(int 포트)에서 IOException 발생

지정된 포트에 바인딩된 서버 소켓을 만들려고 시도합니다. 포트가 이미 다른 응용 프로그램에 의해 바인딩된 경우 예외가 발생합니다.

2

공개 ServerSocket(int 포트, int 백로그)에서 IOException 발생

이전 생성자와 유사하게 backlog 매개변수는 대기 대기열에 저장할 수신 클라이언트 수를 지정합니다.

3

공개 ServerSocket(int 포트, int 백로그, InetAddress 주소)에서 IOException 발생

이전 생성자와 유사하게 InetAddress 매개변수는 바인딩할 로컬 IP 주소를 지정합니다. InetAddress는 여러 IP 주소를 가질 수 있는 서버에 사용되므로 서버가 클라이언트 요청을 수락할 IP 주소를 지정할 수 있습니다.

4

공개 ServerSocket()에서 IOException 발생

바인딩되지 않은 서버 소켓을 만듭니다. 이 생성자를 사용할 때 서버 소켓을 바인딩할 준비가 되면 bind() 메서드를 사용하십시오.

ServerSocket 생성자가 예외를 throw하지 않으면 애플리케이션이 지정된 포트에 성공적으로 바인딩되었으며 클라이언트 요청을 받을 준비가 되었음을 의미합니다.

다음은 ServerSocket 클래스의 일반적인 방법 중 일부입니다 -

Sr.No. 방법 및 설명
1

공개 int getLocalPort()

서버 소켓이 수신 대기 중인 포트를 반환합니다. 이 방법은 생성자에서 포트 번호로 0을 전달하고 서버가 포트를 찾도록 하는 경우에 유용합니다.

2

공용 소켓 accept()에서 IOException 발생

들어오는 클라이언트를 기다립니다. 이 메서드는 클라이언트가 지정된 포트의 서버에 연결하거나 소켓이 시간 초과될 때까지 차단되며, setSoTimeout() 메서드를 사용하여 시간 제한 값이 설정되었다고 가정합니다. 그렇지 않으면 이 메서드는 무기한 차단됩니다.

3

공개 무효 setSoTimeout(int timeout)

서버 소켓이 accept() 동안 클라이언트를 기다리는 시간에 대한 시간 초과 값을 설정합니다.

4

공개 무효 바인드(SocketAddress 호스트, int 백로그)

소켓을 SocketAddress 개체의 지정된 서버 및 포트에 바인딩합니다. 인수가 없는 생성자를 사용하여 ServerSocket을 인스턴스화한 경우 이 방법을 사용하십시오.

ServerSocket이 accept()를 호출하면 클라이언트가 연결할 때까지 메서드가 반환되지 않습니다. 클라이언트가 연결되면 ServerSocket은 지정되지 않은 포트에 새 소켓을 만들고 이 새 소켓에 대한 참조를 반환합니다. 이제 클라이언트와 서버 간에 TCP 연결이 존재하며 통신을 시작할 수 있습니다.

소켓 클래스 메소드

java.net.Socket 클래스는 클라이언트와 서버가 서로 통신하는 데 사용하는 소켓을 나타냅니다. 클라이언트는 인스턴스화하여 Socket 객체를 얻는 반면 서버는 accept() 메서드의 반환 값에서 Socket 객체를 얻습니다.

Socket 클래스에는 클라이언트가 서버에 연결하는 데 사용하는 5개의 생성자가 있습니다. -

Sr.No. 방법 및 설명
1

공용 소켓(문자열 호스트, int 포트)이 UnknownHostException, IOException을 발생시킵니다.

이 메서드는 지정된 포트에서 지정된 서버에 연결을 시도합니다. 이 생성자가 예외를 throw하지 않으면 연결이 성공하고 클라이언트가 서버에 연결됩니다.

2

공용 소켓(InetAddress 호스트, int 포트)에서 IOException 발생

이 메서드는 호스트가 InetAddress 개체로 표시된다는 점을 제외하고는 이전 생성자와 동일합니다.

3

public Socket(String host, int port, InetAddress localAddress, int localPort)에서 IOException이 발생합니다.

지정된 호스트 및 포트에 연결하여 지정된 주소 및 포트의 로컬 호스트에 소켓을 생성합니다.

4

공용 소켓(InetAddress 호스트, int 포트, InetAddress localAddress, int localPort)에서 IOException이 발생합니다.

이 메서드는 호스트가 String 대신 InetAddress 개체로 표시된다는 점을 제외하고는 이전 생성자와 동일합니다.

5

공용 소켓()

연결되지 않은 소켓을 만듭니다. 이 소켓을 서버에 연결하려면 connect() 메소드를 사용하십시오.

Socket 생성자가 반환되면 단순히 Socket 개체를 인스턴스화하는 것이 아니라 실제로 지정된 서버 및 포트에 연결을 시도합니다.

Socket 클래스에서 관심 있는 몇 가지 메서드가 여기에 나열되어 있습니다. 클라이언트와 서버 모두 Socket 개체를 가지고 있으므로 이러한 메서드는 클라이언트와 서버 모두에서 호출할 수 있습니다.

Sr.No. 방법 및 설명
1

공개 무효 연결(SocketAddress 호스트, int 시간 초과)에서 IOException 발생

이 메서드는 소켓을 지정된 호스트에 연결합니다. 이 메서드는 인수가 없는 생성자를 사용하여 Socket을 인스턴스화할 때만 필요합니다.

2

공개 InetAddress getInetAddress()

이 메서드는 이 소켓이 연결된 다른 컴퓨터의 주소를 반환합니다.

3

공개 int getPort()

소켓이 원격 시스템에 바인딩된 포트를 반환합니다.

4

공개 int getLocalPort()

소켓이 로컬 시스템에 바인딩된 포트를 반환합니다.

5

공개 소켓 주소 getRemoteSocketAddress()

원격 소켓의 주소를 반환합니다.

6

공개 InputStream getInputStream()에서 IOException 발생

소켓의 입력 스트림을 반환합니다. 입력 스트림은 원격 소켓의 출력 스트림에 연결됩니다.

7

공개 OutputStream getOutputStream()에서 IOException 발생

소켓의 출력 스트림을 반환합니다. 출력 스트림은 원격 소켓의 입력 스트림에 연결됩니다.

8

public void close()에서 IOException 발생

소켓을 닫으면 이 소켓 개체가 더 이상 서버에 다시 연결할 수 없습니다.

InetAddress 클래스 메서드

이 클래스는 인터넷 프로토콜(IP) 주소를 나타냅니다. 다음은 소켓 프로그래밍을 수행하는 동안 필요한 유용한 방법입니다. -

Sr.No. 방법 및 설명
1

정적 InetAddress getByAddress(byte[] addr)

원시 IP 주소가 제공된 InetAddress 개체를 반환합니다.

2

정적 InetAddress getByAddress(문자열 호스트, 바이트[] addr)

제공된 호스트 이름과 IP 주소를 기반으로 InetAddress를 생성합니다.

3

정적 InetAddress getByName(문자열 호스트)

호스트 이름이 주어지면 호스트의 IP 주소를 결정합니다.

4

문자열 getHostAddress()

IP 주소 문자열을 텍스트 형식으로 반환합니다.

5

문자열 getHostName()

이 IP 주소의 호스트 이름을 가져옵니다.

6

정적 InetAddress InetAddress getLocalHost()

로컬 호스트를 반환합니다.

7

문자열 toString()

이 IP 주소를 문자열로 변환합니다.

소켓 클라이언트 예

다음 GreetingClient는 소켓을 이용하여 서버에 접속하여 Greeting을 보내고 응답을 기다리는 클라이언트 프로그램이다.

예시

// 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!

java

  1. 자바 연산자
  2. 자바 주석
  3. 자바 for-each 루프
  4. 자바 문자열
  5. 자바 인터페이스
  6. 자바 익명 클래스
  7. 자바 리소스 사용
  8. 자바 주석
  9. 자바 어설션
  10. 자바 벡터