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

时间:2014-08-01 00:18:57

标签: python sockets

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

可以找到原始代码here

这是我的代码: `

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

`

我得到的错误是:

`[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`

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

`socket_list = [sys.stdin, s]
read_sockets, write_sockets, error_sockets = select.select(socket_list , [], [])`

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

2 个答案:

答案 0 :(得分:3)

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

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

  

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

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

答案 1 :(得分:-1)

将您的代码 read_sockets, write_sockets, error_sockets = select.select(socket_list , [], []) 替换为

  `read_sockets = select.select([s], [], [], 1)[0]
   import msvcrt
   if msvcrt.kbhit(): read_sockets.append(sys.stdin)`