반응형
# Java Socket(소켓) Multi-Chatting 프로그래밍_소켓이 만들어지는 과정(TCP 3-way Handshake)
- 소켓은 자바 뿐만 아니라 다른 언어에서도 빈번하게 접하는 용어.
- 데이터 통신을 위해 필요.
## 소켓이 만들어 지는 과정 (TCP 3-way Handshake)
- 소켓 : IP 주소와 PORT 번호를 갖고 있는 객체 (class)
- TCP 3-way Handshake : 소켓이 만들어 지는 과정.
- PC 간의 데이터 통신 등에 소켓을 활용.
- 데이터 통신을 위해 소켓에 상대방의 정보를 알고 있어야 한다.
- 자바에서는 아래와 같이 소켓이 만들어진다.
클라이언트 : 요청자.
서버 : 정보 제공자.
1. 첫번째
- 서버 소켓 생성 : 클라이언트의 접속을 받아들이기 위한 소켓.
- 서버 소켓 정보 : 서버로 접속하기 위한 서버 IP 주소, PORT번호를 포함.
- 클라이언트는 서버 소켓을 바탕(서버 IP 주소, PORT번호)으로 서버에 접속.
(접속을 시도할때 클라이언트는 본인의 정보가 담긴 소켓을 가지고 간다.)
2. 두번째 (클라이언트 식별, 바인딩)
- 서버 소켓은 식별, 안내 역할. (실제 통신하는 소켓이 아님)
- 식별된 클라이언트와 통신을 위한 소켓 생성.
(서버에서 만들어진 해당 소켓에는 클라이언트의 정보가 담겨있다.)
3. 세번째 (서버 정보 전달)
- 클라이언트가 통신을 할 수 있도록 서버의 정보를 전달하여 클라이언트의 소켓에 담는다.
=>
결국, 서로(상대방)의 정보를 갖고있는 클라이언트 소켓, 서버 소켓을 바탕으로 통신.
# Java Socket(소켓) Multi-Chatting 프로그래밍_자바에서 소켓 만들기 (ECHO)
## 자바에서 소켓 만들기
- 자바에는 서버 소켓 (Server Socket), 소켓 (Socket) 이 존재 하며, import java.net.* 에 존재 한다.
- 서버 소켓 : 클라이언트의 접속을 대기하는 소켓. (서버 소켓은 통신 불가능, 통신은 소켓으로 가능)
- 서버는 LIST, HASHMAP 에 소켓 정보를 넣어서 관리.
// 서버 소켓 생성
ServerSocket ss = new ServerSocket(9000);
// accept : 클라이언트의 접속 대기. (Blocking Method)
// 식별 후 수락하여 바인딩(소켓생성).
// 해당 소켓은 클라이언트의 정보를 알고 있는 소켓.
Socket sock = ss.accept();
// 생성된 소켓정보를 전송
// 클라이언트는 넘겨받은 서버 IP, PORT 정보를 바탕으로 소켓 생성.
// 해당 소켓은 서버의 정보를 알고 있는 소켓.
Socket sock = new Socket("172.173.8.1", 9000);
- 3-Way-Handshake 요약
1. 접속대기 (Blocking Method)
2. 클라이언트 식별
3. 수락
4. 바인딩 (소켓 생성)
5. 생성된 소켓정보 전송
## 소켓을 이용한 ECHO(메아리) 프로그램 만들기.
- 클라이언트 요청에 서버가 응답하는 ECHO 프로그램. (소켓의 가장 기본)
## 작업 소스
Project06A_Server
import java.io.*;
import java.net.*;
public class Project06A_Server {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(9999);
System.out.println("SERVER READY........");
} catch (Exception e) {
e.printStackTrace();
}
while (true) {
try {
// 접속 대기.
// 해당 소켓은 클라이언트의 정보를 알고 있는 소켓.
Socket socket = serverSocket.accept();
System.out.println("클라이언트 연결 성공!");
// 클라이언트부터 메세지 읽어오기.
InputStream in = socket.getInputStream();
DataInputStream dis = new DataInputStream(in); // 한글 메세지 깨짐 방지 위해 생성.
String message = dis.readUTF();
// 클라이언트에게 메세지 전달하기.
OutputStream out = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(out); // 한글 메세지 깨짐 방지 위해 생성.
dos.writeUTF("[ECHO] " + message + " (서버에서 전송된 메세지.)");
dos.close();
dis.close();
socket.close();
System.out.println("소켓 종료.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Project06A_Client
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Project06A_Client {
public static void main(String[] args) {
try {
// 해당 소켓에는 서버 소켓 정보가 저장됨.
Socket socket = new Socket("127.0.0.1", 9999); // --> accept()
System.out.println("연결 성공!");
// ECHO 메세지 입력.
Scanner scanner = new Scanner(System.in);
String message = scanner.nextLine();
// 서버에 메세지 전달.
OutputStream out = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(out);
dos.writeUTF(message);
// 서버로부터 전달받은 응답.
InputStream in = socket.getInputStream();
DataInputStream dis = new DataInputStream(in);
System.out.println("서버로부터 받은 메세지 : " + dis.readUTF());
dis.close();
dos.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
## 실행 방법
- cmd 관리자 권한으로 실행.
- 프로젝트 폴더 내 bin 폴더 까지 진입 후 아래와 같이 입력하여 실행. (먼저 server 실행, 이후 client 실행.)
java 실행할class파일명
반응형
'인프런 강의 학습 > Java TPC 실전' 카테고리의 다른 글
Java Socket(소켓)을 이용한 Multi-Chatting 프로그래밍 (0) | 2022.08.06 |
---|---|
Java MQTT Client 만들기_Java 에서 MQTT 연동하기. (0) | 2022.08.02 |
Java MQTT Client 만들기_Mosquitto MQTT broker 설치 및 서버구동 (0) | 2022.07.29 |
Java iText API 활용 Excel에서 데이터 읽어서 PDF로 만들기 (0) | 2022.07.28 |
Java iText API 활용 PDF 에 image 삽입 및 크기조절 하기 (0) | 2022.07.27 |