Python(2.7)使用套接字乘以聊天并选择模块(非阻塞代码)

时间:2019-03-25 19:25:42

标签: python-2.7 sockets select

嗨,我有一个练习,要使用套接字选择和msvcrt(使用python 2.7使用btw),mltiplie chat的服务器和客户端(意味着服务器和客户端需要不阻塞地构建),每个客户端都将发送消息服务器将把消息发送给除发送消息的客户端以外的所有客户端,这就是服务器:

import socket
import select


IP = "192.168.1.154"
port = 123
default_buffer_size = 1024
open_client_sockets = []
messages_to_send = []


def send_waiting_messages(wlist):

    for message in messages_to_send:
        (client_sock, data) = message
        if client_sock in wlist:
            for sock in open_client_sockets:
                if sock is not client_sock:
                    sock.send(data)
            messages_to_send.remove(message)


def main():

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((IP, port))
    sock.listen(5)
    print("The server is on and waiting for client...")
    while True:
        rlist, wlist, xlist = select.select([sock] + open_client_sockets, open_client_sockets, [])
        for current_socket in rlist:
            if current_socket is sock:
                (new_socket, addr) = sock.accept()
                open_client_sockets.append(new_socket)
            else:
                data = current_socket.recv(default_buffer_size)
                if data == "":
                    open_client_sockets.remove(current_socket)
                    print("Connection with client closed")
                else:
                    messages_to_send.append((current_socket, 'Hello ' + data))
        send_waiting_messages(wlist)


if __name__ == '__main__':
    main()

构建服务器并非难事,因为本书对此进行了指导(如果没有进行指导,我将永远无法使这段代码正常工作),但是构建客户端存在问题,主要原因是我不了解{{1} }正常工作,找不到答案可以为我简化此模块。 这是我对客户所做的:

select.select

这可能表明您对模块选择和练习并不了解。我看到一些线程也有类似的问题,但是我对它们一无所知,因此我确实需要很好的移植。 总之,我真的迷路了……

1 个答案:

答案 0 :(得分:1)

select(在Windows上)至少需要一个非空的“等待对象”列表,因此,使用sockets = []时,它就无法工作。在sockets = [sock]之后设置sock = socket.socket()

有关简单但完整的示例,请参见此answer to "Handle multiple requests with select"