java
네트워크 프로그래밍이라는 용어 여러 장치(컴퓨터)에서 실행되는 프로그램을 작성하는 것을 말하며, 장치가 모두 네트워크를 통해 서로 연결되어 있습니다.
J2SE API의 java.net 패키지에는 하위 수준 통신 세부 정보를 제공하는 클래스 및 인터페이스 모음이 포함되어 있어 당면한 문제 해결에 중점을 둔 프로그램을 작성할 수 있습니다.
java.net 패키지는 두 가지 공통 네트워크 프로토콜에 대한 지원을 제공합니다. -
TCP − TCP는 전송 제어 프로토콜의 약자로 두 응용 프로그램 간의 안정적인 통신을 허용합니다. TCP는 일반적으로 TCP/IP라고 하는 인터넷 프로토콜을 통해 사용됩니다.
UDP − UDP는 사용자 데이터그램 프로토콜(User Datagram Protocol)의 약자이며, 응용 프로그램 간에 데이터 패킷을 전송할 수 있는 연결 없는 프로토콜입니다.
이 장에서는 다음 두 가지 주제에 대해 잘 이해하고 있습니다. -
소켓 프로그래밍 − Networking에서 가장 널리 사용되는 개념으로 아주 자세하게 설명되어 있습니다.
URL 처리 − 이것은 별도로 다루어집니다. 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는 양방향 통신 프로토콜이므로 두 스트림을 통해 동시에 데이터를 보낼 수 있습니다. 다음은 소켓을 구현하기 위한 완전한 메소드 세트를 제공하는 유용한 클래스입니다.
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 발생 소켓을 닫으면 이 소켓 개체가 더 이상 서버에 다시 연결할 수 없습니다. |
이 클래스는 인터넷 프로토콜(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
자바 링크드리스트 이 튜토리얼에서는 예제를 통해 Java LinkedList에 대해 자세히 알아볼 것입니다. LinkedList Java 컬렉션 프레임워크의 클래스는 연결 목록 데이터 구조(이중 연결 목록)의 기능을 제공합니다. 연결 목록의 각 요소를 노드라고 합니다. . 3개의 필드로 구성됩니다. 이전 - 목록에 있는 이전 요소의 주소를 저장합니다. null입니다. 첫 번째 요소 다음 - 목록에서 다음 요소의 주소를 저장합니다. null입니다. 마지막 요소 데이터 - 실제 데이터 저장 자바 LinkedList 생성
자바 ArrayDeque 이 자습서에서는 예제를 통해 ArrayDeque 클래스와 해당 메서드에 대해 알아봅니다. 또한 배열 deque를 사용하여 스택을 구현하는 방법을 배웁니다. 자바에서는 ArrayDeque를 사용할 수 있습니다. 배열을 사용하여 queue 및 deque 데이터 구조를 구현하는 클래스입니다. ArrayDeque에 의해 구현된 인터페이스 ArrayDeque 클래스는 다음 두 인터페이스를 구현합니다. 자바 대기열 인터페이스 자바 데크 인터페이스 ArrayDeque 생성 배열 데크를 생성하려면 jav