목차
- 소켓(socket)과 소켓통신이란?
- 소켓
- 서버와 클라이언트
- 통신 방식
- 서버 소켓 구현하기
- 클라이언트 소켓 구현하기
- BufferedReader / BufferedWrite 와 PrintWriter / PrintStream
- 소켓통신 사용예제1 (서버와 클라이언트 연결)
- 소켓통신 사용예제2 (1:1 채팅 프로그램)
- 소켓통신 사용예제3 (멀티 채팅 프로그램)
1. 소켓(socket)과 소켓통신이란?
- 소켓(socket) : TCP/IP 기반 네트워크 통신에서 데이터 송수신의 마지막 접점
- 소켓통신 : 소켓을 통해 서버-클라이언트간 데이터를 주고받는 양방향 연결 지향성 통신이며, 지속적으로 연결을 유지하면서 실시간 데이터를 주고받아야 하는 경우에 사용
1) 소켓
소켓(socket)은 클라이언트와 서버 소켓으로 구분되며, 소켓간 통신을 위해서는 네트워크상에서 클라이언트와 서버에 해당되는 컴퓨터를 식별하기 위한 IP주소와 해당 컴퓨터 내에서 현재 통신에 사용되는 응용프로그램을 식별하기 위한 포트번호(port)가 사용됨
2) 서버와 클라이언트
- 서버(Server) : 데이터를 제공
- 클라이언트(Client) : 데이터를 요청하고 전달 받음
3) 통신 방식
- UDP : 비연결형 (무전기, 개인 쪽지에 사용)
- TCP : 연결형 (핸드폰, 1:1 채팅에 사용)
2. 서버 소켓 구현하기
1) 서버 소켓 생성
ServerSocket serverSocket = new ServerSocket(8000); // 포트 번호
2) 클라이언트 접속 대기
Socket socket = serverSocket.accept();
3) 데이터 송수신을 위한 input/output 스트림 생성
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
4) input 스트림을 통한 데이터 수신 (클라이언트 > 서버)
byte[] inputData = new byte[100];
int length = in.read(inputDate);
String inputMessage = new String(inputData, O, length);
5) output 스트림을 통한 데이터 송신 (서버 > 클라이언트)
String outputMessage = "보낼 메세지";
out.write(outputMessage.getBytes());
out.flush();
6) 통신 종료
socket.close();
serverSocket.close();
3. 클라이언트 소켓 구현하기
1) 클라이언트 소켓 생성을 통한 서버접속
Socket socket = new Socket("127.0.0.1", 8000); // "IP주소", 포트번호
2) 데이터 송수신을 위한 input/output 스트림 생성
InputStream in = socket.getInputStream( );
OutputStream out = socket.getOutputStream( );
3) output 스트림을 통한 데이터 송신 (클라이언트 > 서버)
String outputMessage = "보낼 메시지";
out.write(outputMessage.getBytes( ));
out.flush( );
4) input 스트림을 통한 데이터 수신 (서버 > 클라이언트)
byte[ ] inputData = new byte[100];
int length = in.read(inputData);
String inputMessage = new String(inputData, 0, length);
5) 통신 종료
socket.close( );
4. BufferedReader / BufferedWriter 와 PrintWriter / PrintStream
데이터 전송의 기본 단위는 바이트(byte)로 문자의 경우 데이터 전송시 문자를 바이트로, 수신시 바이트를 문자로 변환이 필요
이를 위해서 앞에서는 String클래스의 생성자와 getBytes메소드를 사용
자바에서는 이 변환을 편리하게 해주는 클래스로 InputStreamReader와 OutputStreamWriter가 있으며, charset을 지정하여 사용할 수 있다
또한, 데이터 입출력의 효율을 위해 바로 전달하지 않고 중간에 버퍼를 이용하기 위해서 BufferedReader와 BufferedWriter 클래스를 함께 사용할 수 있다
ex)
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream( )));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream( )));
데이터 출력의 경우에는 출력 포맷을 편리하게 해주는 기능이 있는 PrintWriter 또는 PrintStream 클래스를 사용할 수 있습니다.
ex)
PrintWriter out = new PrintWriter(socket.getOutputStream( ));
PrintStream out = new PrintStream(socket.getOutputStream( ));
5. 소켓통신 사용예제1 (서버와 클라이언트 연결)
1) Server
2) Client
3) 결과 화면
- Server 코드 실행
- Client 코드 실행
- Console 창 우측 [Display Sellected Console] 클릭으로 Server / Client 선택해서 볼 수 있음
6. 소켓통신 사용예제2 (1:1 채팅 프로그램)
1) Server
2) Client
3) 결과 화면
7. 소켓통신 사용예제3 (멀티 채팅 프로그램)
'IT 언어 > Java' 카테고리의 다른 글
[Java] 람다식 (Lamda) (0) | 2024.02.22 |
---|---|
[Java] Thread -2 (데몬 스레드, 사용자 스레드) (0) | 2024.02.20 |
[Java] Thread -1 (프로세스, 싱글스레드, 멀티스레드) (0) | 2024.02.19 |
[Java] enum (열거형 사용법) (0) | 2024.02.19 |
[Java] 제네릭 (Generics) (0) | 2024.02.15 |