본문 바로가기
CS/NetWork

Socket Programming(소켓 프로그래밍)

by 계범 2022. 1. 12.
네트워크 관련 글 순서(참조 영상 기준)

애플리케이션 계층
- 네트워크 애플리케이션의 원리
- DNS
- TCP를 이용한 Socket 프로그래밍

전송계층
- 전송 계층 서비스의 원리
- rdt 원리
- 연결 지향 전송: TCP
- TCP 흐름 제어(3-way handshake, 4-way handshake)
- TCP 혼잡 제어

네트워크 계층
- 네트워크 계층 서비스
- Network Address Translation(NAT), DHCP
- 라우팅 알고리즘(Link State, Distance Vector)
- 계층적 경로 변경(AS)

링크 계층
- 다중 엑세스 프로토콜
- LANs(근거리 통신망)

무선 및 모바일 네트워크
- 무선 네트워크

웹 요청 시 일어나는일

네트워크 보안
- 대칭키 & 공개키,RSA 암호화
- Secure e-mail, SSL, MAC
- IPSec(ESP), Firewall(방화벽)

 

 

Socket이란

네트워크 통신을 할 수 있게 도와주는 구조체.

운영체제에서 제공해주는 인터페이스. 결론적으로 데이터를 주고 받을 수 있게 해준다.

 

보통 TCP/IP 계층[각주:1]에서 동작하는 소켓을 주로 사용한다.
이를 TCP 소켓 또는 TCP/IP 소켓이라고 부른다.

OSI 7계층 참조: 2022.01.05 - [CS/NetWork] - OSI 7계층

 

서버와 클라이언트의 통신

이 소켓을 통해 서버와 클라이언트 측의 통신이 이루어지며, 아래와 같은 방식으로 이루어진다.

 

recipes4dev.tistory.com

 

서버

  1. socket(): 소켓 생성
  2. bind(): 주소 바인딩(IP주소 및 포트번호)
  3. listen(): 접속대기
  4. accept(): 클라이언트 연결
  5. send()/recv(): 데이터 전달 및 받기
  6. close(): 자원 해제

클라이언트

  1. socket()
  2. connect(): 서버에 접속 요청
  3. send()/recv()
  4. close()

 

TCP Socket(Socket Stream) 구현(Java 코드)

Java의 Server Socket API를 통해 구현

 

인텔리제이 프로젝트 내 클래스로 구현

cmd창에서 ipconfig로 현재 본인 서버의 ip주소 확인
여기선 임의로 127.0.0.1로 하겠음 포트는 5050
  • 서버 구현 코드
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {


    public static void main(String arg[])
    {
        Socket socket = null;                //Client와 통신하기 위한 Socket
        ServerSocket server_socket = null;  // 서버 생성을 위한 ServerSocket
        BufferedReader in = null;            //Client로부터 데이터를 읽어들이기 위한 입력스트림
        PrintWriter out = null;                //Client로 데이터를 내보내기 위한 출력 스트림

        try{
            server_socket = new ServerSocket(5050);

        }catch(IOException e)
        {
            System.out.println("해당 포트가 열려있습니다.");
        }
        try {

            System.out.println("서버 오픈!!");
            socket = server_socket.accept();    //서버 생성 , Client 접속 대기

            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));    //입력스트림 생성
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); //출력스트림 생성

            String str = null;
            str = in.readLine();                //Client로부터 데이터를 읽어옴

            System.out.println("Client로 부터 온 메세지 : " + str);

            out.write(str);
            out.flush();
            socket.close();
        }catch(IOException e){}
    }
}
  • 클라이언트 구현 코드
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class Client {
    public static void main(String[] arg) {
        Socket socket = null;            //Server와 통신하기 위한 Socket
        BufferedReader in = null;        //Server로부터 데이터를 읽어들이기 위한 입력스트림
        BufferedReader in2 = null;        //키보드로부터 읽어들이기 위한 입력스트림
        PrintWriter out = null;            //서버로 내보내기 위한 출력 스트림
        InetAddress ia = null;
        try {
            ia = InetAddress.getByName("127.0.0.1");    //서버로 접속
            socket = new Socket(ia,5050);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            in2 = new BufferedReader(new InputStreamReader(System.in));
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));

            System.out.println(socket.toString());
        }catch(IOException e) {

        }

        try {
            System.out.print("서버로 보낼 메세지 : ");
            String data = in2.readLine();            //키보드로부터 입력
            out.println(data);                        //서버로 데이터 전송
            out.flush();

            String str2 = in.readLine();            //서버로부터 되돌아오는 데이터 읽어들임
            System.out.println("서버로부터 되돌아온 메세지 : " + str2);
            socket.close();

        }catch(IOException e) {

        }
    }
}

 

통신결과

클라이언트 콘솔

Socket[addr=/127.0.0.1,port=5050,localport=9692]
서버로 보낼 메세지 : 화이팅
서버로부터 되돌아온 메세지 : 화이팅

Process finished with exit code 0

서버 콘솔

서버 오픈!!
Client로 부터 온 메세지 : 화이팅

Process finished with exit code 0

 

 


참조

 

KOCW 네트워크 강의 - 한양대 2018 1학기 이석복 교수님

 

컴퓨터네트워크

본 강의에서는 인터넷 내부의 동작을 이해하는데 초점을 둔다. 인터넷의 기본이 되는 다양한 컴퓨터네트워크 프로토콜을 응용계층으로부터 시작하여 링크계층까지 Top-down방식으로 소개한다.

www.kocw.net

 

자바 소켓 코드 참조

 

[JAVA] TCP 소켓 프로그래밍 01 - Server/Client 일대일 연결

TCP 소켓 프로그래밍 01 - 일대일 연결 이번 포스팅에서는 Socket을 활용하여 Clinet측에서 Server로 일대일 연결을 유지하면서 Client측에서 보낸 메세지를 Server측에서 수신하여 수신 받은 메세지를 다

lktprogrammer.tistory.com

 

  1. OSI 7 Layer 중 4번째 계층 [본문으로]

댓글