首页 文章

在Windows中使用Python - 'sys.stdin'错误

提问于
浏览
0

为了尝试使用Windows在Python中使用聊天系统,我在客户端使用了以下代码:

chat_client.py

import sys, socket, select

def chat_client():
    if(len(sys.argv) < 3) :
        print 'Usage : python chat_client.py hostname port'
        sys.exit()

    host = sys.argv[1]
    port = int(sys.argv[2])

    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]

        # Get the list sockets which are readable
        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__":

    sys.exit(chat_client())

但是,我在尝试连接到服务器(也在Python中运行)时收到以下错误:

select.error:(10038,'尝试对非套接字的操作')

这与sys.stdin有关 .

我认为这是Windows上的文件对象不可接受的问题,但是套接字是 . 在Windows上,底层选择函数由WinSock库提供,不处理不是源自WinSock的文件描述符 .

有没有解决方法来允许在Windows上实现 chat_client.py 代码的方法?

1 回答

  • 0

    是否有解决方法,以便在Windows上实现chat_client.py代码的方法?

    您可以定期检查输入活动,例如: G . 用_替换你的 select 语句

    # Get the list sockets which are readable, time-out after 1 s
            read_sockets = select.select([s], [], [], 1)[0]
            import msvcrt
            if msvcrt.kbhit(): read_sockets.append(sys.stdin)
    

    请注意,在此示例方法中,当一个人开始输入一行时,只有在输入行完成后才会显示传入的消息 .

相关问题