본문 바로가기
파이썬

소켓통신(에코서버-클라이언트)

by 가오가이거 2020. 12. 14.
#서버 코드
import socket, threading

def echo_msg(soc):#soc:접속한 클라이언트 1명당 서버와 1:1통신하는 소켓
    while True:
        data = soc.recv(1024)  # recv(크기):소켓에서 메시지 읽음
        msg = data.decode()  # 인코딩된 메시지를 원래대로 디코딩함
        print('Received from', msg)
        soc.sendall(data)
        if msg == '/stop':
            break
    #쓰레드 종료
    print('쓰레드 종료')

def main():
    HOST = 'localhost'
    PORT = 9999
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind((HOST, PORT))
    server_socket.listen()

    print('server start')
    while True:
        client_socket, addr = server_socket.accept()
        print('Connected by', addr)

        th = threading.Thread(target=echo_msg, args=(client_socket, ))
        th.start()

    server_socket.close()

main()
#클라이언트 코드
import socket

HOST = 'localhost'
PORT = 9999

#통신할 소켓 오픈 
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#서버 accept()에 연결요청. server ip, port
client_socket.connect((HOST, PORT))

while True:
    msg = input('msg:')
    client_socket.sendall(msg.encode(encoding='utf-8'))

    data = client_socket.recv(1024)
    print('Received', data.decode())
    if msg=='/stop':
        break

client_socket.close()