利用多線程threading實現簡單的羣聊服務器
服務端
import socket
import threading
users = {}
def msg_chat(cc, addr):
userName = cc.recv(100000).decode('utf-8')
users[userName] = cc
print(userName + '已連接')
for k, v in users.items():
v.send((userName+'加入羣聊').encode('utf-8'))
while True:
try:
msg = cc.recv(100000).decode('utf-8')
for k, v in users.items():
v.send((userName+'說:\n' + msg).encode('utf-8'))
except Exception:
print(userName+'斷開連接')
del users[userName]
for k, v in users.items():
v.send((userName+'退出羣聊').encode('utf-8'))
break
def startServer():
ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ss.bind(('127.0.0.1', 9888))
ss.listen(10)
print('服務器已啓動...')
while True:
cc, addr = ss.accept()
st = threading.Thread(target=msg_chat, args=(cc, addr))
st.start()
def runServer():
r = threading.Thread(target=startServer)
r.start()
if __name__ == '__main__':
runServer()
客戶端
import socket
import threading
ck = None
def recv_msg():
while True:
msg = ck.recv(100000).decode('utf-8')
print(msg)
if len(msg) == 0:
ck.close()
break
def connServer():
global ck
cc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cc.connect(('127.0.0.1', 9888))
userName = '張三'
cc.send(userName.encode('utf-8'))
ck = cc
st = threading.Thread(target=recv_msg)
st.start()
def send_msg():
while True:
msg = input('輸入消息:')
ck.send(msg.encode('utf-8'))
if __name__ == '__main__':
connServer()
send_msg()
客戶端多複製幾份,修改用戶名字