컴퓨터네트워크 - Application Layer : Socket Programming

이정수·2025년 8월 13일

컴퓨터네트워크

목록 보기
15/21

네트워크 상에서 프로세스간 통신 : IPC

소켓 ( Sockets ) OS - 소켓

네트워크 상에서 연결된 두 컴퓨터의 프로세스IPC를 위한 Endpoint
IPC를 수행할 네트워크컴퓨터프로세스소켓번호로 식별

Client SocketServer Socket으로 구분되어 소켓을 연결하여 두 프로세스 간 네트워크 통신을 가능하게함.

프로토콜 계층 상에서 어플리케이션 계층프로세스트랜스포트 계층프로토콜Message를 전달하는 Interface 역할을 수행

프로토콜 계층어플리케이션 계층에서 어플리케이션에서 생성한 Message를 다른 Host어플리케이션으로 전달하기위해 소켓을 통해 트랜스포트 계층으로 Message를 송수신
어플리케이션 계층프로세스는 개발자에 의해 제어되고, 그 이하 계층프로세스 OS에 의해 제어됨

  • 네트워크 상 소켓 식별
    。네트워크 통신을 수행할 프로세스는 하나의 소켓을 가진다.
    소켓을 생성하는 경우 Port Number가 식별자로서 각각의 소켓에 할당됨

    Socket = IP Address + Port
    32bitIP Address 번호와 각 Host프로세스를 연결하는 파이프 용도의 Port의 번호를 조합하여 네트워크로 연결된 Host를 식별 후 IPC를 수행

    ex) www.google.com:8080의 경우 도메인 주소로 변환한 IP Addrss서버컴퓨터에서 Port를 통해 데이터를 요청

UDP 소켓 프로그래밍 흐름
UDP Server Socket은 상시 실행
UDP Client Socket은 송수신하는 동안 실행

1. UDP Server SocketUDP Client Socket 생성
Server Socket 생성 시 포트번호는 개발자에 의해 명시적으로 지정

2. Segment와 함께 Server HostIP AddressServer Socket포트번호를 포함하여 Datagram을 생성 후 UDP Client Socket을 통해 전송
Datagram 송신 시 Client HostIP주소Client Socket포트번호가 자동으로 포함

3. UDP Server Socket에서 해당 Datagram을 수신 및 ClientIP 주소포트번호를 추출

4. 작업 후 Server Socket을 통해 Client IP주소포트번호를 포함하여 Datagram 생성 후 해당하는 Client Socket으로 응답

5. ClientSocket에서 ServerSocket으로부터 Datagram 수신 및 ClientSocket 종료

JAVA - UDP 소켓 구현

  • UDP Client Socket
    Class의 생성자로 Logic을 구현 후 main 메서드에서 객체를 생성하여 UDP Client의 송수신을 실행
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClient {
    private String str;
    private BufferedReader file;
    private static int SERVERPORT = 12000;
    public UDPClient(String hostname,int port) {
        try{
            InetAddress ia = InetAddress.getByName(hostname);
            DatagramSocket ds = new DatagramSocket(port);
            file = new BufferedReader(new InputStreamReader(System.in));
            str = file.readLine();
            byte buffer[] = str.getBytes();
            DatagramPacket dp = new DatagramPacket(
                    buffer, buffer.length, ia, SERVERPORT);
            ds.send(dp);
            buffer = new byte[1024];
            dp = new DatagramPacket(buffer, buffer.length);
            ds.receive(dp);
            System.out.println("server ip : "+dp.getAddress() + " , server port : "+dp.getPort());
            System.out.println("수신된 데이터 : "+ new String(dp.getData()).trim());
        }catch(IOException ioe){
            ioe.printStackTrace();
        }
    }
    public static void main(String[] args) throws Exception {
        new UDPClient("localhost",2000);
    }
}

Server HostIP AddressServerSocketPort번호 : 12000와 송신할 데이터를 통해 DatagramPacket ( = Datagram 역할 )생성
Server HostIP AddressHostnameIP AddressDNS하는 InetAddress에 의해 도출

UDPTCP와 달리 비연결성 프로토콜이므로 데이터에 목적지 소켓의 IP Address포트번호를 추가해야하므로 DatagramPacket을 통해 Datagram을 구현

。이후 포트번호 : 2000Client Socket에 의해 DatagramPacket네트워크로 전송

  • UDP Server Socket
    Class의 생성자로 Logic을 구현 후 main 메서드에서 객체를 생성하여 UDP Server Socket의 송수신을 실행
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPServer {
    public UDPServer(int port){
        try {
            DatagramSocket ds = new DatagramSocket(port);
            while (true) {
                byte buffer[] = new byte[512];
                DatagramPacket dp = new DatagramPacket(buffer,buffer.length);
                System.out.println("ready");
                ds.receive(dp);
                String str = new String(dp.getData());
                System.out.println("수신된 데이터 : " + str);
                InetAddress ia = dp.getAddress();
                port = dp.getPort();
                System.out.println("client ip : " + ia + " , client port : " + port);
                dp = new DatagramPacket(dp.getData(),dp.getData().length, ia,port);
                ds.send(dp);
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
    public static void main(String[] args) throws Exception {
        new UDPServer(12000);
    }
}

DatagramSocket에 의해 UDP Client Socket에 의해 전송된 DatagramPacket을 수신 시 해당 DatagramPacket에 포함된 Client HostIP AddressClient Socket 포트번호를 추출 후 응답.

TCP 소켓 프로그래밍 흐름
TCP Server Socket은 상시 실행
TCP Client SocketTCP Connection 연결 및 송수신 후 연결종료

1. TCP Server Socket 생성 및 TCP Client Socket으로부터의 TCP Connection 요청을 대기
Server Socket 생성 시 포트번호는 개발자에 의해 명시적으로 지정

2. TCP Client Socket 생성 및 TCP Connection 수행

3. TCP Connection이 된 경우 TCP Client Socket을 통해 TCP Server Socket으로 Request 전송

4. TCP Server Socket에서 Request 수신 후 응답하여 TCP Client Socket로 전송 및 해당 TCP Connection 종료 및 연결재대기

5. 응답을 수신한 경우 TCP Client Socket 종료

JAVA - TCP 소켓 구현
Socket 클래스와 ServerSocket 클래스의 객체를 생성하여 Server SocketClient Socket로서 활용

  • Server Socket
    Server-Side로서 TCP 서버 역할을 수행할 특정 포트번호로 바인딩된 ServerSocket Class의 객체 생성
    서버소켓객체는 바인딩된 포트번호Client Socket부터의 연결요청을 상시대기

    Client Socket로부터 연결이 된 경우 서버소켓객체.accept()를 통해 Client SocketSocket 객체를 반환
    Client SocketSocket Class객체가 반환된 경우 두 프로세스 간 연결이 정상적으로 되었으며 반환된 Socket 객체를 통해 통신을 수행

    。통신이 전부 수행된 경우 서버소켓객체.close() 를 통해 프로세스 간 연결종료
import java.io.*;
import java.net.*;
public class DateServer {
    public static void main(String[] args) throws Exception {
        // 포트 8080의 TCP 서버소켓 생성
        ServerSocket server = new ServerSocket(8080);
        while ( true ){
            // 포트:8080으로 Client Socket으로부터의 연결요청 대기
            System.out.println("연결대기중");
            // 연결요청 수신 및 Client Socket의 Socket 객체 반환
            Socket client = server.accept();
            PrintWriter pout = new PrintWriter(client.getOutputStream(),true);
            System.out.println("새로운 클라이언트 소켓 연결됨");
            pout.println(new java.util.Date().toString());
            // 소켓 종료 및 연결요청 재대기
            client.close();
        }
    }
}

.

  • Client Socket
    。연결을 수행할 특정 ServerSocket의 컴퓨터의 IP주소, 포트번호를 생성자로 전달하여 연결될 Client Socket 역할의 Socket 객체를 생성
    ▶ 해당 Socket 객체를 통해 데이터의 송수신을 수행
 import java.io.*;
import java.net.*;
public class DateClient {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("127.0.0.1", 8080);
        InputStream in = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String line = null;
        // 소켓으로부터 Date 를 Read
        while ((line = br.readLine()) != null ) System.out.println(line);
        // 소켓 연결 종료
        socket.close();
    }
}
profile
공부기록 블로그

0개의 댓글