WinError 10038 Windows上sys.stdin的替代品?

时间:2015-12-13 15:34:06

标签: python sockets

我正在使用套接字在Python Networking上阅读,并在最后找到了下面的代码。我有一个工作正常的服务器文件,并在端口9009上启动服务器。

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

但是,当我尝试上面的客户端部分时,我得到:

OSError: [WinError 10038] An operation was attempted on something that is not a socket

错误来自的行是:

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

sys.exit(chat_client())

我已经阅读了有关同一错误的其他问题,他们的答案是在读取所有数据之前套接字已关闭。但是在上面,没有socket.close()函数,但是在服务器文件中。我试过删除它,更改缩进但仍然得到相同的错误。

另外,阅读类似问题我发现sys.stdin不是套接字,这可能就是我收到此错误的原因。我能做些什么来解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

  

另外,阅读类似的问题,我发现了这一点   Intent intent = new Intent(Solve.this, MainActivity.class); 不是套接字,这可能就是我的原因   得到这个错误。我能做些什么来解决这个问题吗?

您可以定期检查输入活动,例如: G。将您的sys.stdin语句替换为

select

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

答案 1 :(得分:0)

我遇到了同样的问题,但是在关闭套接字时却没有,请尝试s.close()

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

您将socket.socket(socket.AF_INET, socket.SOCK_STREAM) =设置为s会更容易使用s.close()并且应该可以工作,如果您找到其他问题的解决方案,让我知道它使我发疯了