The Three-Way Handshake (또는 TCP Three-Way Handshake)는 TCP/IP 프로토콜을 사용하여 컴퓨터간에 연결을 설정할 때 사용되는 절차입니다.
SYN (Synchronize Sequence Number) 패킷을 보냅니다.SYN 패킷을 받으면, 이를 수락하고 클라이언트로부터의 연결을 요청합니다.SYN 패킷에 응답하여 SYN-ACK 패킷을 클라이언트에게 보냅니다.SYN-ACK 패킷은 서버의 초기 sequence number와 함께 전송됩니다.SYN-ACK 패킷을 받으면, 이에 대한 응답으로 ACK (Acknowledgment) 패킷을 보냅니다.ACK 패킷에는 클라이언트가 서버의 sequence number를 받았다는 것을 알리는 acknowledgement number가 포함됩니다.SYN 패킷을 보내고, 서버가 이를 SYN-ACK 패킷으로 응답하고, 클라이언트가 이를 ACK 패킷으로 확인하는 과정을 포함합니다.TCP 소켓 프로그래밍은 네트워크 프로그래밍의 기본입니다. 이번 포스트에서는 Java를 사용하여 간단한 TCP 서버와 클라이언트를 구현하는 방법을 알아보겠습니다. 이 예제를 통해 클라이언트가 서버에 메시지를 보내고, 서버가 해당 메시지에 응답하는 기본적인 채팅 애플리케이션을 만들 수 있습니다.
먼저, 서버 측 코드입니다. 서버는 특정 포트에서 클라이언트의 연결 요청을 기다리고, 연결이 이루어지면 클라이언트로부터 메시지를 수신하고 응답을 보냅니다.
package ex03.net.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
public static void main(String[] args) {
ServerSocket ss = null;
Socket s = null;
System.out.println("Server Start~~~~~~~");
try {
ss = new ServerSocket(9000); // 9000번 포트에서 서버 소켓을 생성
s = ss.accept(); // 클라이언트의 연결을 대기
// 입력 및 출력 스트림 생성
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
byte[] arr = new byte[100];
is.read(arr); // 클라이언트로부터 메시지 수신
System.out.println(new String(arr));
String message = "안녕....Client......";
os.write(message.getBytes()); // 클라이언트로 응답 메시지 전송
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
s.close();
ss.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
ServerSocket을 9000번 포트에 바인딩하여 생성합니다.accept() 메서드를 호출하여 클라이언트의 연결 요청을 수락합니다.InputStream과 OutputStream을 사용하여 클라이언트와의 데이터 통신을 처리합니다.이제, 클라이언트 측 코드입니다. 클라이언트는 서버에 연결을 요청하고, 서버로 메시지를 보내고 서버로부터 응답을 받습니다.
package ex03.net.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ClientTest {
public static void main(String[] args) {
Socket s = null;
try {
s = new Socket("192.168.0.143", 9000); // 서버 IP 및 포트로 소켓 생성
// 입력 및 출력 스트림 생성
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
String str = "안녕하세요....Server~~~~~";
os.write(str.getBytes()); // 서버로 메시지 전송
byte[] buffer = new byte[100];
is.read(buffer); // 서버로부터 응답 메시지 수신
System.out.println(new String(buffer));
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
s.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
}
InputStream과 OutputStream을 사용하여 서버와의 데이터 통신을 처리합니다.ServerTest 클래스를 먼저 실행하여 서버를 시작합니다. "Server StartClientTest 클래스를 실행하여 클라이언트가 서버에 연결하고 메시지를 전송합니다. 클라이언트와 서버 간의 메시지 주고받기를 콘솔에서 확인할 수 있습니다.
2.클라이언트 실행:

3.서버에서 클라이언트 메세지 확인:
