내가 보려고 만든 블로그

<Python> Socket 통신으로 간단한 채팅 프로그램 만들기 본문

Python | Web/Python

<Python> Socket 통신으로 간단한 채팅 프로그램 만들기

정의김 2022. 7. 13. 21:02

 

 

Socket을 이용해서 간단한 채팅 프로그램 만들기!

 

1. Server.py ( 채팅서버 )

import socket
from _thread import *

client_sockets  = []
HOST = 'localhost'
PORT = 9099

print("Server Start")
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()

def threaded(client_socket, addr):
    print('>> Connected by :', addr[0], ':', addr[1])
    while True:

        try:
            data = client_socket.recv(1024)

            if not data:
                print('>> Disconnected by ' + addr[0], ':', addr[1])
                break

            print('>> Received from ' + addr[0], ':', addr[1], data.decode())

            for client in client_sockets :
                if client != client_socket :
                    client.send(data)

        except ConnectionResetError as e:
            print('>> Disconnected by ' + addr[0], ':', addr[1])
            break

    if client_socket in client_sockets :
        client_sockets.remove(client_socket)
        print('remove client list : ',len(client_sockets))

    client_socket.close()

try:
    while True:
        client_socket , addr = server_socket.accept()
        client_sockets.append(client_socket)
        start_new_thread(threaded ,(client_socket, addr))
        print("clients = " ,len(client_sockets))

except Exception as e:
    print("error : " ,e)
finally:
    server_socket.close()

1. AF_INET -> IP4v 를 사용 하겠다는 뜻. SOCK_STREAM은 TCP 패킷을 받겠다는 뜻이라고 한다.

2. socker.SO_REUSEADDR -> 소켓통신으로 연결하고 close해도 해당 포트는 TIME_WAIT 상태로 대기하기 때문에 다시 소켓을 열면 에러가 남. 이러한 에러를 방지하기 위해 주소를 재사용할수있게 옵션 설정. SOL_SOCKET 과 1의 의미는 공식문서를 봐도 잘 나오지가 않는다... ㅠ

3. bind -> 생성한 소켓을 해당 호스트 ,포트에 바인딩 . 

4. while True: 를 통해 계속 서버가 동작하고 있다가 client 가 들어오면 accept해주고 새 쓰레드를 생성.

5. threaded 함수를 보면 client_socket.recv(1024) 를 통해 데이터를 받음. 1024는 버퍼의 바이트 크기. 

6. 받은 데이터를 데이터를 보낸 client를 제외하고 for문을 돌며 뿌림. 

 

2. Client.py

만들어진 소켓서버에 접속하기 위한 client.py

import socket
from _thread import *

HOST = '127.0.0.1'
PORT = 9099

client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect((HOST, PORT))

def recv_data(client_socket) :
    while True :
        data = client_socket.recv(1024)

        print("recive : ",repr(data.decode()))
start_new_thread(recv_data, (client_socket,))
print ('>> Connect Server')

while True:
    message = input('')
    if message == 'quit':
        close_data = message
        break

    client_socket.send(message.encode())
client_socket.close()

1. 만들어둔 서버 소켓에 접속한 후 socket.send를 통해 메세지를 보내기만 하면된다.

 

실행

 

 

'Python | Web > Python' 카테고리의 다른 글

<Python> typing  (0) 2022.10.14
<Python> Framework 안쓰고 Api 서버 만들기  (0) 2022.08.20
<파이썬> Decorator 란?  (0) 2021.08.15
<파이썬> Descriptor  (0) 2021.08.08
<파이썬> Property  (0) 2021.08.08