파이썬 소켓 프로그래밍

신민창·2021년 4월 14일
0

프로젝트

목록 보기
3/5
post-custom-banner

소켓 프로그래밍

소켓

  • 소프트웨어로 작성된 추상적인 개념의 통신 접속점이며 네트워크 응용 프로그램은 소켓을 통하여 통신망으로 데이터를 송수신

  • 두 개의 프로그램이 네트워크를 통해 서로 통신을 수행할 수 있도록 양쪽에 생성되는 링크의 단자

  • 두 소켓이 연결되면 서로 다른 프로세스끼리 데이터를 전달할 수 있음

특징

Client 측과 server 측이 특정 port를 통해 실시간으로 양방향 통신
실시간 통신이 필요한 경우에 자주 사용
http 통신과 반대되는 성질

파이썬으로 구현

server.py

import socket, threading

def binder(client_socket, addr):
    # 커넥션이 되면 접속 주소가 나온다.
    print('Connected by', addr);
    try:
        while True:
            # 1024byte 이하의 데이터 수신
            data = client_socket.recv(1024);
            msg = data.decode();
            # 수신된 메시지를 콘솔에 출력한다.
            print('Received from', addr, msg);
    
            msg = "echo : " + msg;
            data = msg.encode();
            length = len(data);
            client_socket.sendall(length.to_bytes(1024, byteorder="little"));
            # 데이터를 클라이언트로 전송한다.
            client_socket.sendall(data);
    except:
    # 접속 해제시 except
        print("except : " , addr);
    finally:
    # 종료
        client_socket.close();

# 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);

server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1);

# 10000번 포트 사용
server_socket.bind(('',10000));

server_socket.listen(1);

try:
    # 클라이언트가 접속하기 전까지 서버는 실행되야하기 때문에 무한 루프 사용
    while True:
        client_socket, addr = server_socket.accept();
    # 쓰레드 사용해서 대기
        th = threading.Thread(target=binder, args = (client_socket,addr));
        th.start();
except:
    print("server");
finally:
    # 종료
    server_socket.close();

client.py

import socket

HOST = '127.0.0.1' # local 호스트 사용
PORT = 10000 # 10000번 포트 사용
# 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 접속
client_socket.connect((HOST, PORT))

while True:
    sendData = input("input data :")
    client_socket.send(sendData.encode('utf-8'))
client_socket.close();

실행 화면


연결하면 Connetced by가 표시된다.

이제 client 측에서 server 측에 메시지를 계속 보낼 수 있다.

이렇게 소켓 프로그래밍을 파이썬으로 구현해보았다.

post-custom-banner

0개의 댓글