내가 보려고 만든 블로그
<Python> Socket 통신으로 간단한 채팅 프로그램 만들기 본문
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 |