python-2.7 - Python(2.7)使用套接字和选择模块进行多重聊天(非阻塞代码)

标签 python-2.7 sockets select

嗨,我有一个练习要使用套接字选择和 msvcrt(顺便说一句,使用 python 2.7)、mltiplie 聊天的服务器和客户端(意味着服务器和客户端需要非阻塞地构建),每个客户端都将发送消息和服务器会将消息发送给除了发送消息的所有客户端,这是服务器:

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()

这可能表明我实际上对模块选择和练习的了解不足。我看到一些有类似问题的线程,但我对它们一无所知,所以我真的需要很好的解释。
总之,我真的迷路了......

最佳答案

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

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

关于python-2.7 - Python(2.7)使用套接字和选择模块进行多重聊天(非阻塞代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55345101/

相关文章:

python - 在 python 中使用 networkx 创建树数据

python - 如何解决“未定义的 "Cannot read property '字段”

python-2.7 - Pandas DataFrame用无替换NaT

sockets - erlang:到controlling_process(),或者不到controlling_process()

mysql - 更新并显示 mysql 查询

Python 凯撒密码解码

java - 连接到服务器的套接字客户端数

Java套接字连接

mysql - SQL select user grouped by ip 并在一个表中选择具有相同ips的所有其他用户

sql - 在 SQL Server 中执行嵌套 case 语句逻辑的最佳方法