반응형

# 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파일명
반응형

+ Recent posts