[Java] socket을 통한 가상회선연결

cometLEE·2022년 11월 9일

JAVA

목록 보기
1/1
post-thumbnail

TCP 소켓프로그래밍


socket을 통한 server - client간의 일대일 연결을 메세지를 통해 수신받고,
client쪽의 결과와 그 내용을 server쪽으로 재전송하는 과정을 통해 가상회선을 배워보자.

  • TCP 소켓 프로그래밍 과정


[맛있는 프로그래머의 일상]: https://lktprogrammer.tistory.com/62

  1. server에서는 server socket 생성
  2. accept()를 통해 client쪽의 연결 요청을 대기
  3. client쪽에서 client socket 생성 및 connect request 전송
  4. server쪽 socket 반환
  5. 생성된 socket을 통해 Buffered Reader, PrintWriter 통해 송수신 가능
  6. 연결된 가상회선을 통해 데이터 송수신

TCP 3-Way Handshake

TCP 3 Way Handshake는 TCP/IP프로토콜을 이용하여 통신을 하는 응용프로그램이 데이터를 전송하기 위한 과정이다.

이번 socket프로그래밍을 통해 연결전송을 알 수 있었다.

연결설정

  1. TCP 헤더의 SYN 플래그를 지정한 세그먼트를 전송함(SYN = 1)
  2. clinet측에서는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT상태가 된다
  3. server측에서는 SYN/ACK 플래그를 지정한 세그먼트를 발송함(SYN = 1, ACK = 1)
  4. client에서 수신이 완료가 되면 ACK 플래그를 지정한 세그먼트를 발송함(ACK = 1)
  • connection 완료 및 socket을 통해 가상회선 생성, 데이터 송수신 과정 진행

[JAVA] server

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(8200);
            System.out.println("EchoServer is started and waiting for client.....");
            Socket client = ss.accept();
            // 클라이언트의 연결 요청을 무한정 대기. 연결된 클라이언트의 정보(ip address, mac address, port)
            System.out.println("Client is connected : "+ client);

            // 환영메세지 보내기
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
            out.println("Welcom! This is a EchoServer."); // 송신버퍼에 저장 -> 원래는 버퍼가 가득차면 보냄.
            out.flush(); // 버퍼에 담기지 않고 바로 나가!. -> 송신 버퍼를 비워라. 전송 시작.
            // -> flush되면 버퍼가 비워짐. -> 프로그램 종료 -> socket해제 -> 연결 끊김.
            while(true) {
                String msg = in.readLine(); // 클라이언트로부터 메세지 수신
                System.out.println("From client : " + msg);
                if(msg == null) break;
            }
        } catch (IOException e){
            e.printStackTrace(); // 어디서 오류가 나는가
        }
    }
}

[JAVA]client

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class EchoClient {
    public static void main(String[] args) {
        Scanner scn = new Scanner(System.in);
        try {
            Socket socket = new Socket("127.0.0.1", 8200); // 서버에 연결 과정
            System.out.println("Connection is successful!!!" + socket);
            // 서버의 ip address, port, 자신의 port
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
            String msg = in.readLine(); // 수신
            System.out.println(msg);
            while(true) {
                System.out.print("Your message : ");
                msg = scn.next();
                if (msg.equals("stop")) break;
                out.println(msg); // 엔터가 입력되어야 버퍼가 비워짐.!!!
                out.flush();

            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

server -> client connection과정

  1. serversocket 오브젝트 생성. 생성자 인자 값에 client port번호 입력.

  2. accept() 통해 client 접속 대기

  3. connection이 되면 BufferedReader, PrintWriter클래스를 통해 데이터 송수신


PrintWriter 오브젝트인 out을 통해 메세지를 보낼 때,
송신버퍼는 가득 채워서 보내기 때문에 보낼 메세지 이후 flush()로 버퍼를 비워주는 작업이 필요함!!


client -> server connection과정

  1. socket 오브젝트 생성후, 생성자 인자 값에 자신의 ipaddress, server가 열어놓은 port번호를 입력한다

  2. server와 같이 BufferedReader, PrintWriter클래스를 통해 데이터 송수신

다음과 같이 잘 출력됨을 알 수 있다.

마치며

이번 내용으로 소켓프로그래밍의 기본적인 내용에 대해 공부할 수 있었다.
앞으로 열심히 공부해보겠다. 틀린 점 있다면 댓글로 알려주시면 감사하겠다.

profile
server, kubernetes에 관심이 많이 있습니다

0개의 댓글