python核心编程课后作业2-10

多用户全双工多房间。这次实现了房间功能,删掉了私聊的功能。本来想同时实现的,发烧脑子烧坏了,代码写的又臭又长,难过。

参数介绍:服务器存储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()


client_test.py

#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版权协议,转载请附上原文出处链接和本声明。