多用户全双工多房间。这次实现了房间功能,删掉了私聊的功能。本来想同时实现的,发烧脑子烧坏了,代码写的又臭又长,难过。
参数介绍:服务器存储account(用户),以及chat_room(聊天室)的信息。其中account中存储了用户名,用户socket以及用户所在房间(没有进入房间则为None)。chat_room中存储了聊天室的id,以及所有进入聊天室的用户名称。
思路:客户端连接后,存储用户名称以及socket,用户输入房号后,更新chat_room中聊天室内用户名称列表。
server_test.py
from socket import *
import threading
import re
HOST = '127.0.0.1'
PORT = 10889
BUFSEZI = 1024
ADDR = (HOST, PORT)
ROOMS = 5
PEOPLES = 10
# save people socket {'tom':[sock,room]}
account = {}
# save chat room information
chatroom = {}
def sendMsg(socket, username):
while True:
data = socket.recv(BUFSEZI)
if data == 'quit':
if account[username][1]:
room = account[username][1]
if len(room) > 1:
for i in chatroom[room]:
if i is not username:
account[i][0].send('%s left the room' % username)
chatroom[account[username][1]].remove(username)
del account[username]
socket.send(data)
socket.close()
print '%s logout' % username
break
elif re.match(r'room:[0-9]{3}',data):
room = str(data[5:])
if chatroom.has_key(room):
account[username][1] = room
chatroom[room].append(username)
print '%s into %s room' % (username, room)
socket.send('Welecom to %s room' % room)
else:
socket.send('error')
else:
if account[username][1]:
room = account[username][1]
if len(room) > 1:
for i in chatroom[room]:
if i is not username:
account[i][0].send(data)
else:
print account[username][1]
socket.send('input your room numbers')
def create_room():
for i in range(ROOMS):
chatroom[str('%03d' % (i+1))] = []
if __name__ == '__main__':
# create chat room
create_room()
tcpSerSocket = socket(AF_INET, SOCK_STREAM)
tcpSerSocket.bind(ADDR)
tcpSerSocket.listen(PEOPLES)
while True:
print 'waiting for connection...'
tcpCliSocket,addr = tcpSerSocket.accept()
print 'connected from :', addr
username = tcpCliSocket.recv(BUFSEZI)
if account.has_key(username):
tcpCliSocket.send("Reuse")
tcpCliSocket.close()
else:
tcpCliSocket.send("Welcome!")
account[username] = [tcpCliSocket, None]
recev_msg = threading.Thread(target=sendMsg, args=(tcpCliSocket, username))
recev_msg.start()
#coding=utf-8
from socket import *
from time import ctime
import threading
HOST='localhost'
PORT=10889
BUFSIZ=1024
ADDR=(HOST,PORT)
def sendMsg(sock):
while True:
data = raw_input('>')
sock.send(data)
if data == 'quit':
break
def recvMsg(sock):
while True:
data = tcpCliSock.recv(BUFSIZ)
if data == 'quit':
sock.close()
break
elif data == 'error':
print 'input your room numbers'
else:
print '[%s] %s' % (ctime(),data)
if __name__ == '__main__':
tcpCliSock=socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
username = raw_input('please input your name:')
tcpCliSock.send(username)
data = tcpCliSock.recv(BUFSIZ)
if data == 'Reuse':
print 'The username has been used!'
else:
send_msg = threading.Thread(target=sendMsg, args=(tcpCliSock,))
recv_msg = threading.Thread(target=recvMsg, args=(tcpCliSock,))
send_msg.start()
recv_msg.start()
send_msg.join()
tcpCliSock.close()
版权声明:本文为qq_19342635原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。