利用多线程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()
客户端多复制几份,修改用户名字