マルチチャットルーム(マルチスレッド|epoll)
1770 ワード
マルチスレッドを使用すると、サーバがクライアントごとにスレッドを開き、各スレッドがリードを待つクライアントをブロックするには2つのスレッドが必要であり、1つはリードに使用され、1つはライトに使用されます.epollのコードはまだ研究中のhttps://github.com/jwzh222/epollはこれを参考にすることができますちなみにwindowsの下にはepollがなく、Linuxだけがサポートされています.
import socket
import threading
socket_list = []
s = socket.socket()
s.bind(('127.0.0.1', 8888))
s.listen()
def read_client(s):
try:
#
return s.recv(2048).decode('utf-8')
except:
# , , socket
print(str(addr) + ' Left!')
socket_list.remove(s)
def socket_target(s):
try:
while True:
content = read_client(s)
if content is None:
break
else:
print(content)
#
for client in socket_list:
client.send((str(addr) + ' say: ' + content).encode('utf-8'))
except:
print('Error!')
while True:
conn, addr = s.accept()
# , socket
socket_list.append(conn)
print(str(addr) + ' Joined!')
# ,
threading.Thread(target=socket_target, args=(conn,)).start()
import socket
import threading
s = socket.socket()
s.connect(('10.34.22.166', 8888))
def read_server(s):
while True:
#
content = s.recv(2048).decode('utf-8')
print(content)
threading.Thread(target=read_server, args=(s,)).start()
while True:
line = input('')
if line == 'exit':
break
# socket
s.send(line.encode('utf-8'))