고양이 여름이의 지식채널
[Java] Java 소켓 프로그래밍 설명 및 예제 본문
자바 소켓 프로그래밍은 네트워크를 통해 클라이언트와 서버 애플리케이션 간의 양방향 통신을 가능하게 합니다. 네트워크 응용 프로그램을 구현하는 데 널리 사용되는 방법이며 웹 기반 응용 프로그램, 분산 시스템 및 클라이언트-서버 아키텍처에 널리 사용됩니다.
소켓 프로그래밍
소켓 프로그래밍은 서버와 클라이언트라는 두 개의 주요 엔티티를 포함합니다. 서버는 들어오는 클라이언트 연결을 기다리고 클라이언트는 데이터를 보내고 받기 위해 서버에 연결합니다.
소켓 프로그래밍에서 소켓은 IP 주소와 포트 번호의 조합을 말합니다. 클라이언트가 서버의 IP 주소와 포트 번호를 지정하여 서버에 연결하는 동안 서버는 특정 포트 번호에서 연결을 수신합니다.
서버 소켓 생성
자바에서 서버 소켓을 작성하려면 ServerSocket 클래스를 사용할 수 있습니다. ServerSocket의 개체는 서버가 수신 연결을 수신할 위치를 결정하는 특정 포트 번호로 작성됩니다.
다음은 자바에서 ServerSocket 개체를 만드는 예입니다.
# 5000번 포트로 수신하는 ServerSocket
int port = 5000;
ServerSocket serverSocket = new ServerSocket(port);
클라이언트 연결
일단 ServerSocket이 생성되면, 서버는 수신 클라이언트 연결을 실행할 수 있습니다. 이 작업은 ServerSocket 클래스의 accept() 메서드를 사용하여 수행됩니다. accept() 메서드는 클라이언트 연결이 이루어질 때까지 서버를 차단합니다.
다음은 Java에서 클라이언트 연결을 허용하는 예입니다.
Socket clientSocket = serverSocket.accept();
클라이언트 소켓 생성
자바에서 클라이언트 소켓을 만들려면 소켓 클래스를 사용할 수 있습니다. 소켓 개체는 연결할 서버의 IP 주소와 포트 번호를 사용하여 만들어집니다.
다음은 자바에서 Socket 개체를 만드는 예입니다.
String host = "localhost";
int port = 5000;
Socket clientSocket = new Socket(host, port);
데이터 전송 및 수신
클라이언트와 서버가 연결되면 소켓 클래스의 InputStream 및 OutputStream 개체를 통해 데이터를 보내고 받을 수 있습니다. InputStream은 클라이언트 또는 서버에서 데이터를 읽는 데 사용되는 반면 OutputStream은 클라이언트 또는 서버에 데이터를 쓰는 데 사용됩니다.
다음은 클라이언트에서 자바의 서버로 데이터를 보내는 예입니다.
## 클라이언트 소켓의 OutputStream 개체를 가져와
## getBytes() 메서드를 사용하여 메시지 문자열을 바이트로
## 변환한 다음 바이트를 서버에 입력(write) 합니다.
OutputStream out = clientSocket.getOutputStream();
String message = "Hello, server!";
out.write(message.getBytes());
클라이언트로부터 데이터를 수신하는 예는 다음과 같습니다.
## 클라이언트 소켓의 InputStream 개체를 가져와
## 수신 데이터를 저장할 버퍼를 만들고 수신 데이터를 버퍼로 읽습니다.
## 그런 다음 바이트 버퍼를 문자열로 변환하고 메시지를 출력합니다
InputStream in = clientSocket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = in.read(buffer);
String message = new String(buffer, 0, bytesRead);
main 프로그램 예시
SERVER
## server
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(1234);
System.out.println("Server started, listening on port 1234");
// 클라이언트 연결 대기
Socket clientSocket = serverSocket.accept();
System.out.println("Client connected from " + clientSocket.getInetAddress());
// 클라이언트 소켓에 대한 입력/출력 스트림 생성
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
// 클라이언트의 입력을 읽고 응답
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received from client: " + inputLine);
out.println("Server received: " + inputLine);
}
// 클라이언트 및 서버 소켓 닫기
in.close();
out.close();
clientSocket.close();
serverSocket.close();
}
}
CLIENT
## Client
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 1234);
// 서버 소켓에 대한 입력/출력 스트림 생성
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 서버에 메시지를 보내고 응답을 읽습니다
String message = "Hello, server!";
out.println(message);
System.out.println("Sent to server: " + message);
String response = in.readLine();
System.out.println("Received from server: " + response);
// 소켓을 닫습니다
in.close();
out.close();
socket.close();
}
}
::실제 프로그램에서 여러 클라이언트를 동시에 처리하려면 오류 처리, 스레드 등을 추가해야 합니다.
[Java] Java Collections. (컬렉션)