[네트워크]TCP 에코 통신 프로그램

Boknami·2022년 4월 7일

네트워크

목록 보기
1/1

소켓이란?

HTTP가 HTML파일을 통신하는 것처럼 소켓도 비슷하게 통신을 수행한다.

HTTP는 클라이언트가 서버에게 HTML을 요청하는 순간에만 반응하고 단뱡향 통신이나 소켓은 양방향 통신을 지원한다.

Ex) 두 개의 컴퓨터가 통신을 하는 경우에 각 컴퓨터의 소켓을 통해서 데이터를 교환한다.

소켓에 2가지 방식

TCP

Transmission Control Protocol

연결형 프로토콜

속도는 느리지만 신뢰성은 확실하다!

인터넷 내에서 데이터를 주고 받을 때 경로 설정을 효과적으로 수행하기 위해서 데이터를 여러 개의 패킷으로 나누어 송수신을 한다.

⇒ 여러 패킷으로 나누어 오류 발생 시 전체 재전송이 아니라 해당 패킷만 다시 보내면 된다! ( 오류에 대응하기 좋다)

UDP

User Datagram Protocol

비 연결형 프로토콜

TCP와 반대로 속도는 빠르지만 신뢰성이 부족하다.

데이터 통신 전에 사전 통신 절차가 없다.

소켓 통신의 과정

1.서버에서 소켓을 생성하고 대기

2.클라이언트에서 소켓을 생성하고 연결 요청

3.패킷 단위로 데이터를 송수신

4.처리가 끝나면 소켓을 소멸시킨다

포트

특정 프로그램이 통신을 하기 위해서 포트번호 할당이 필요!

16비트 → 65536개 사용 가능

주의 : 1~1024 포트는 시스템 포트

소켓 프로그래밍 함수

socket

socket(주소 체계, 소켓의 타입, 프로토콜)

⇒ 소켓을 생성하는 함수!

bind

bind(소켓 변수, 서버 주소 구조체, 서버 주소 구조체의 크기)

⇒ 서버쪽 소켓에 IP, Port를 할당하고 네트워크 인터페이스와 묶일 수 있도록

listen

listen(소켓 변수, 백 로그 큐 크기)

⇒ 서버가 클라이언트로부터의 연결 요청을 기다린다

⇒ 백 로그는 동시에 연결 시도하는 최대의 클라이언트의 수

connect

connect(소켓 변수, 서버 주소 구조체, 서버 주소 구조체 크기)

⇒ 클라이언트쪽에서 서버에 연결을 요청

accept

accept(소켓 변수, 클라이언트 주소 구조체 변수, 클라이언트 주소 구조체 크기)

⇒ 서버가 클라이언트로부터 온 연결 요청을 수락한다.

send

send(소켓 변수, 문자열 버퍼, 버퍼 크기 ,플래그)

⇒ 상대방에게 데이터를 보냄

⇒ 문자열 버퍼에 담긴 내용을 전송

recv

recv(소켓 변수, 문자열 버퍼, 버퍼 크기 , 플래그)

⇒ 데이터를 수신하여 특정 문자열 버퍼에 담는다.

closesocket

⇒ 소켓을 닫아준다.

데이터 보내기

JSON

Java Script Object Notation

단순히 데이터를 표시하는 표현 방법!!

데이터를 저장하거나 전송할 때 많이 사용되는 경량 DATA 교환 방식

JS에서 객체를 만들 때 사용하는 표현식!

이해하기 쉽고 용량이 작다.

key / value가 존재한다.

key, 문자열 ⇒ 항상 쌍따옴표 “ “

중첩 사용 가능

{
	"name" : "GeunJae",
	"msg" : "WoW"
}

안에 배열 같은 값도 가능하다!

loads( )

JSON 문자열 ~~> Python 객체

JSON문자열 읽기

dumps()

Python객체 ~~> JSON문자열

load()

JSON파일 ~~> Python객체

저장되어 있는 파일을 파이썬 객체로 불러오고 싶은 경우!

실제 구현 코드 [python]

Client

from socket import *
import json

#옵션 입력받는 함수
def Select_Option():
    option = int(input("🔧 옵션을 선택하세요 🔧"
                           + "\n1.일반적인 에코 메세지"
                           +"\n2.모든 메세지를 대문자로"
                           + "\n3.모든 메세지를 소문자로"
                           +"\n[옵션 선택] : "))
    return option

#메시지 입력받는 함수
def Message_input(option):
    if(option == 1):
        msg = input('[메시지 입력] : 기본 메세지를 입력 : ')
    elif(option == 2):
        msg = input('[메시지 입력] : 대문자로 변경 될 메세지를 입력 : ')
    elif(option == 3):
        msg = input('[메시지 입력] : 소문자로 변경 될 메세지를 입력 : ')
    else:
        print('잘못된 입력입니다.')
    return msg

Port = 9999
#소켓을 생성한다.
C_Socket = socket(AF_INET, SOCK_STREAM)

#기본 출력 및 이름 입력받기
print('🚀소켓 에코 채팅 프로그램🚀')
name = input("[이름 입력] : ")
print('[접속 대기] : 9000번 포트로 접속 대기중...')

#서버와 연결!
C_Socket.connect(('127.0.0.1', Port))
print('[연결 성공]정상적으로 연결되었습니다.\n')

option = Select_Option()
msg = Message_input(option)

#패킷 만들기
Packet = {
    "이름" : name,
    "메시지" : msg,
    "옵션" : option
}

#JSON형식으로 패킷 만들기
Json_Packet = json.dumps(Packet)

#JSON형식으로 패킷 전송
C_Socket.send(Json_Packet.encode('utf-8'))

Server

from socket import *
import json

port = 9999

#소켓 생성
S_Socket = socket(AF_INET, SOCK_STREAM)

#서버 소켓에 포트할당하고 네트워크 인터페이스가 묶일 수 있도록
S_Socket.bind(('', port))

#서버가 클라이언트로부터의 연결 요청을 기다린다, 매개변수는 최대 클라이언트 숫자
S_Socket.listen(1)
print("[서버 동작 시작]")
        
#서버가 클라이언트로부터 온 연결 요청을 수락
Connect_Socket, addr = S_Socket.accept()
print('[정상 접속] : 정상적으로 접속되었습니다.\n')

#패킷 받기
Receive_Pakcet = Connect_Socket.recv(4096).decode('utf-8')

#패킷 풀기
Changing_Python_Packet = json.loads(Receive_Pakcet)

print('[Before|받은 메시지] : ', Changing_Python_Packet['이름'], '님 께서 보낸 메시지 : ', Changing_Python_Packet['메시지'])

#패킷 옵션에 따라 출력 변경
if(Changing_Python_Packet['옵션'] == 1):
    msg = Changing_Python_Packet['메시지']
elif(Changing_Python_Packet['옵션'] == 2):
    print('[옵션2] : 대문자로 변환되어 출력됩니다.')
    msg = Changing_Python_Packet['메시지'].upper()
elif(Changing_Python_Packet['옵션'] == 3):
    print('[옵션3] : 소문자로 변환되어 출력됩니다.')
    msg = Changing_Python_Packet['메시지'].lower()
        
print('[After | 받은 메세지] : ', msg)

Packet = {
    "메시지" : msg
}

Connect_Socket.close()

실제 실행화면

느낀 점

과제 때문에 시작하게 됬지만 오히려 알게 된 것이 많다.

일단 소켓이라는 것부터 공부를 했다. 흔히 사용하는 http통신은 클라이언트가 서버에게 HTML을 요청하는 순간에만 반응하고 단뱡향 통신이고, 소켓은 양방향으로 통신이 가능했다.

소켓통신에서도 여러가지 과정이 있었고, 소켓을 만들고 포트, ip를 할당하고 응답을 기다리고 받고 등 여러 가지 해줘야 할 것들이 많았다.

또한 파이썬으로 만들면서 적당한 파이썬 기본 공부도 된 것 같은 느낌이다.

0개의 댓글