Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Python(2.7)使用套接字和选择模块(非阻塞代码)进行乘法聊天_Python 2.7_Sockets_Select - Fatal编程技术网

Python 2.7 Python(2.7)使用套接字和选择模块(非阻塞代码)进行乘法聊天

Python 2.7 Python(2.7)使用套接字和选择模块(非阻塞代码)进行乘法聊天,python-2.7,sockets,select,Python 2.7,Sockets,Select,您好,我有一个练习要使用sockets select和msvcrt(顺便说一句,使用python 2.7)、mltiplie chat的服务器和客户端(意味着服务器和客户端需要以非阻塞方式构建)构建,每个客户端都将发送消息,服务器将向所有客户端发送消息,但发送消息的客户端除外,这是服务器: import socket import select IP = "192.168.1.154" port = 123 default_buffer_size = 1024 open_client_soc

您好,我有一个练习要使用sockets select和msvcrt(顺便说一句,使用python 2.7)、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()
构建服务器并不难,因为它是由书指导的(如果不是由书指导的话,我就永远不会让这个代码工作),但我在构建客户端时遇到问题,主要原因是我不理解
select.select
是如何工作的,找不到对我来说足够简化这个模块的答案。 这就是我对客户所做的:

import socket
import select
import msvcrt

IP = "192.168.1.154"
port = 123


sockets = []


def write():
    pass


def main():
    sock = socket.socket()
    sock.connect((IP, port))
    while True:
        rlist, wlist, xlist = select.select(sockets, sockets, [])
        for current_socket in rlist:
            if current_socket is sock:
                data = current_socket.recv(1024)
                print(data)
            else:
                sockets.append(current_socket)
        write()


if __name__ == '__main__':
    main()
这可能表明我对模块选择和练习的理解程度较低。我看到一些线程有类似的问题,但我什么也不懂,所以我真的需要很好的解释。 总之,我真的迷路了…

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

有关一个简单但完整的示例,请参见此