선릉역 1번 출구

TCP 네트워킹 - 1 본문

Computer/Network

TCP 네트워킹 - 1

choideu 2023. 1. 2. 21:45

TCP = 연결 지향적 프로토콜(Server - Client가 연결된 상태에서 데이터를 주고 받음)

*연결: 3 way hand shake

SYN(a) - SYN(b)/ACK(a+1) - ACK(b+1)

 

TCP Server의 역할

  • 클라이언트가 연결 요청을 해오면 연결을 수락하는 것
    • Java의 java.net.ServerSocket
  • 연결된 클라이언트와 통신하는 것
    • Java의 java.net.Socket
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ServerSocket serverSocket = null;
		try {
			serverSocket = new ServerSocket();
			serverSocket.bind(new InetSocketAddress("localhost", 5001));
			while(true) {
				System.out.println("[연결 기다림]");
				Socket socket = serverSocket.accept();
				InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
				System.out.println("[연결 수락함]" + isa.getHostName());
			}
		} catch(Exception e) {}
		
		if(!serverSocket.isClosed()) {
			try {
				serverSocket.close();
			} catch(IOException e1) {}
		}
		
	}

}

binding port: 클라이언트가 접속할 포트를 의미함

Accept() -> 클라이언트가 연결 요청을 해오면 해당 메소드로 연결 수락을 하고, 클라이언트와 통신할 Socket을 만들고 리턴함

해당 메소드는 클라이언트가 연결 요청하기 전까지 블로킹됨 -> 블로킹(스레드가 대기 상태가 된다는 것)

exception) accept()가 블로킹되어 있을 때 ServerSocket을 닫기위해 close()를 호출하면 SocketException이 발생함

 

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

public class ClientExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Socket socket = null;
		try {
			socket = new Socket();
			System.out.println("[연결 요청]");
			socket.connect(new InetSocketAddress("localhost", 5001));
			System.out.println("[연결 성공]");
		} catch(Exception e) {}
		
		if(!socket.isClosed()) {
			try {
				socket.close();
			} catch(IOException e1) {
			}
		}
	}

}

 

Comments