Python sock 聊天客户端 - select.select() 和 sys.stdin 的问题

Tum*_*Bit 5 python sockets

所以我目前正在尝试使用服务器和一些客户端制作一个小型聊天客户端。我在网上找到了一些代码,我想用它作为我自己的代码的基础。我现在面临的问题是它是用Python 2.x编写的,而我正在使用3.x。确实没有太多需要转换的内容,但我在程序使用sys.stdin.

原始代码可以在这里找到。

这是我的代码:`

import sys, socket, select

def chat_client():
    host = 'localhost'
    port = 9009

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(2)

    # connect to remote host
    try :
        s.connect((host, port))
    except :
        print('Unable to connect')
        sys.exit()

    print('Connected to remote host. You can start sending messages')
    sys.stdout.write('[Me] '); sys.stdout.flush()

    while 1:
        socket_list = [sys.stdin, s]

        read_sockets, write_sockets, error_sockets = select.select(socket_list , [], [])

        for sock in read_sockets:            
            if sock == s:
                # incoming message from remote server, s
                data = sock.recv(4096)
                if not data :
                    print('\nDisconnected from chat server')
                    sys.exit()
                else :
                    #print data
                    sys.stdout.write(data)
                    sys.stdout.write('[Me] '); sys.stdout.flush()     

            else :
                # user entered a message
                msg = sys.stdin.readline()
                s.send(msg)
                sys.stdout.write('[Me] '); sys.stdout.flush() 

if __name__ == "__main__":
    chat_client()
Run Code Online (Sandbox Code Playgroud)

`

我收到的错误是:

`[Me] Traceback (most recent call last):
  File "client.py", line 46, in <module>
    chat_client()
  File "client.py", line 25, in chat_client
    read_sockets, write_sockets, error_sockets = select.select(socket_list , [],
 [])
OSError: [WinError 10038] An operation was attempted on something that is not a
socket`
Run Code Online (Sandbox Code Playgroud)

我显然收到此错误,因为没有任何类型的输入,但由于我无法找到任何我可以理解下面几行中发生的情况的文档,所以我很难修复它。我不知道它应该通过什么样的输入sys.stdin

`socket_list = [sys.stdin, s]
read_sockets, write_sockets, error_sockets = select.select(socket_list , [], [])`
Run Code Online (Sandbox Code Playgroud)

抱歉,如果我对我的问题不够清楚,请回复,我将提供您需要的任何信息。感谢你们对我的帮助 :)

Jas*_*n S 4

WinError建议您使用 Windows。sys.stdin在 *nix 平台上可以被视为套接字,但在 Windows 上则不能。

请参阅: https: //docs.python.org/3/library/select.html

请注意,在 Windows 上,它仅适用于套接字;在其他操作系统上,它也适用于其他文件类型(特别是在 Unix 上,它适用于管道)。

快速搜索表明,人们可能会通过select在一个线程上使用套接字并在第二个线程上阻止本地 I/O 来解决此问题,但不要引用我说这是最好或唯一的方法。像 Twisted 这样的异步框架可能也已经解决了这个问题。