JAVA/Coding
[JAVA] 자바 소켓(Socket)통신 이란? 코드 구현
Huiyeon
2023. 9. 1. 17:52
https://huiyeon.tistory.com/48
[JAVA] 자바 소켓(Socket)통신 이란? 개념 정리
소켓(Socket)이란? 소켓은 프로토콜, ip주소, 포트넘버로 정의가 된다. TCP/UDP 두 가지 방식으로 분류 된다. TCP는 연결형 프로토콜이고, UDP에 비해 속도는 느리지만 신뢰성 있는 데이터 송수신을 보
huiyeon.tistory.com
저번 개념 정리에 이어서 코드 구현에 대해 작성해 보았습니다.
TCP와 UDP
- TCP와 UDP는 전송 계층에서 사용되는 프로토콜로, TCP는 신뢰성 있는 데이터 전송을 보장하고 연결 지향적이며, UDP는 비연결성이고 신뢰성이 낮지만 빠른 데이터 전송을 지원합니다.
- Java에서는 TCP와 UDP를 모두 지원하며, 소켓(Socket)을 통해 이러한 프로토콜을 사용할 수 있습니다.
URL 클래스와 URLConnection 클래스
- URL 클래스는 웹 주소(Uniform Resource Locator)를 추상화한 클래스로, 웹 페이지나 웹 서버에 접근할 때 주로 사용됩니다.
- URLConnection 클래스는 URL을 통해 원격 자원에 접근하기 위한 정보를 제공하며, HTTP 연결과 관련된 정보를 얻거나 설정할 수 있습니다.
소켓(Socket) 프로그래밍
- 소켓 프로그래밍은 네트워크 통신을 위한 핵심 개념 중 하나입니다.
- Java에서는 소켓을 사용하여 클라이언트-서버 애플리케이션을 구축할 수 있습니다.
- Socket과 ServerSocket 클래스를 사용하여 TCP 기반의 통신을 구현할 수 있으며, DatagramSocket 클래스를 사용하여 UDP 기반의 통신을 구현할 수도 있습니다.
- 또한, 네트워크 프로그래밍에서는 예외 처리가 중요합니다. 다양한 예외 상황에 대비하여 try-catch 블록을 활용하여 예외 처리를 해주어야 합니다.
EchoServer.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer {
private BufferedReader bufferR;
private BufferedWriter bufferW;
private InputStream is;
private OutputStream os;
private ServerSocket serverS;
public EchoServer(int port){
try{
serverS = new ServerSocket(port);
}catch(IOException ioe){
ioe.printStackTrace();
System.exit(0);
}while(true){
try{
System.out.println("클라이언트의 요청을 기다리는 중");
Socket tcpSocket = serverS.accept();
System.out.println("클라이언트의 IP 주소: "+ tcpSocket.getInetAddress().getHostAddress());
is = tcpSocket.getInputStream();
os = tcpSocket.getOutputStream();
bufferR = new BufferedReader(new InputStreamReader(is));
bufferW = new BufferedWriter(new OutputStreamWriter(os));
String message = bufferR.readLine();
System.out.println("수신메세지 : "+message);
message += System.getProperty("line.separator");
bufferW.write(message);
bufferW.flush();
bufferR.close();
bufferW.close();
tcpSocket.close();
} catch(IOException ioe){
ioe.printStackTrace();
}
}
}
public static void main(String[] args) {
new EchoServer(1234);
}
}
- 이 코드는 간단한 에코(Echo) 서버를 구현한 Java 프로그램입니다. 에코 서버는 클라이언트가 보낸 메시지를 그대로 돌려주는 역할을 합니다. 이 코드에서는 TCP/IP 프로토콜을 사용하여 클라이언트와 서버 간의 통신을 처리합니다.
클래스 및 필드 선언
- EchoServer 클래스는 서버의 주요 로직을 포함합니다.
- bufferR과 bufferW는 클라이언트와 통신할 때 사용되는 입출력 버퍼를 나타냅니다.
- is와 os는 입력 스트림과 출력 스트림을 나타냅니다.
- serverS는 서버 소켓을 나타냅니다.
생성자
- 생성자 EchoServer(int port)는 포트 번호를 매개변수로 받아 서버 소켓을 생성합니다.
- 클라이언트의 연결 요청을 기다리며, 연결 요청이 들어오면 클라이언트와 통신하는 코드를 무한 루프로 실행합니다.
서버 소켓 생성
- serverS = new ServerSocket(port); 코드로 서버 소켓을 생성합니다.
- 지정된 포트 번호(port)에서 클라이언트의 연결 요청을 대기합니다.
클라이언트 연결 대기
- serverS.accept(); 메서드로 클라이언트의 연결 요청을 기다립니다.
- 클라이언트가 연결 요청하면 이 메서드는 클라이언트와 통신할 소켓 객체인 tcpSocket을 반환합니다.
클라이언트와 통신
- tcpSocket을 통해 클라이언트와 입출력 스트림을 생성합니다.
- 클라이언트가 보낸 메시지를 bufferR을 사용하여 읽고, 이를 서버에서 그대로 다시 클라이언트로 보내기 위해 bufferW를 사용합니다.
- 읽은 메시지는 message 변수에 저장되고, 이를 다시 보내기 위해 개행 문자를 추가한 후 bufferW를 통해 클라이언트에게 전송합니다.
- 마지막으로 입출력 스트림과 소켓을 닫습니다.
EchoClient.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class EchoClient {
private String ip;
private int port;
private String str;
BufferedReader file;
public EchoClient(String ip, int port) throws IOException {
this.ip = ip;
this.port = port;
Socket tcpSocket = getSocket();
OutputStream os_socket = tcpSocket.getOutputStream();
InputStream is_socket = tcpSocket.getInputStream();
BufferedReader bufferR = new BufferedReader(new InputStreamReader((is_socket)));
BufferedWriter bufferW = new BufferedWriter(new OutputStreamWriter(os_socket));
System.out.println("입력 : ");
file = new BufferedReader(new InputStreamReader(System.in));
str = file.readLine();
str += System.getProperty("line.separator");
bufferW.write(str);
bufferW.flush();
str = bufferR.readLine();
System.out.println("Echo Reault : " + str);
file.close();
bufferW.close();
bufferR.close();
tcpSocket.close();
}
public Socket getSocket() {
Socket tcpSocket = null;
try {
tcpSocket = new Socket(ip, port);
}catch (IOException ioe) {
ioe.printStackTrace();
System.exit(0);
}
return tcpSocket;
}
public static void main(String[] args) throws IOException {
new EchoClient("localhost", 1234);
}
}
- 이 코드는 Java를 사용하여 간단한 에코(Echo) 클라이언트를 구현한 프로그램입니다. 에코 클라이언트는 서버로 문자열을 보내고, 서버가 그 문자열을 그대로 다시 보내는 간단한 통신 프로그램입니다.
클래스 및 필드 선언
- EchoClient 클래스는 클라이언트의 주요 로직을 포함합니다.
- ip와 port는 서버에 연결할 때 사용할 IP 주소와 포트 번호를 저장합니다.
- str은 사용자가 입력한 문자열을 저장합니다.
- file은 사용자로부터 키보드 입력을 받기 위한 BufferedReader 객체입니다.
생성자
- 생성자 EchoClient(String ip, int port)는 서버의 IP 주소와 포트 번호를 매개변수로 받아 클라이언트를 초기화합니다.
- getSocket() 메서드를 호출하여 서버에 소켓 연결을 시도하고, 연결된 소켓 객체를 얻어옵니다.
- 클라이언트와 서버 간의 통신을 위한 입력 스트림(is_socket)과 출력 스트림(os_socket)을 얻습니다.
사용자 입력 받기
- 사용자에게 입력 메시지를 출력하고, 키보드로부터 문자열을 입력받아 str 변수에 저장합니다.
- 이 때 System.getProperty("line.separator")를 추가하여 개행 문자를 포함한 문자열로 변환합니다.
서버로 메시지 전송
- 클라이언트에서 서버로 메시지를 전송하기 위해 출력 스트림(bufferW)을 사용합니다.
- str에 저장된 메시지를 bufferW를 통해 서버로 전송하고, 버퍼를 비웁니다.
서버로부터 에코된 메시지 수신
- 서버로부터의 응답을 받기 위해 입력 스트림(bufferR)을 사용합니다.
- bufferR을 통해 서버로부터 에코된 메시지를 읽어들이고, 그 값을 str 변수에 저장합니다.
자원해제
- 사용이 끝난 자원들을 닫습니다. file, bufferW, bufferR, 그리고 소켓(tcpSocket)을 순서대로 닫습니다.
getSocket 메서드
- getSocket 메서드는 서버에 소켓 연결을 시도하고, 연결된 소켓 객체를 반환합니다.
- 서버 IP 주소와 포트 번호를 사용하여 소켓을 생성합니다.
감사합니다 - !
반응형