我想在Windows下运行下面的python服务器:
""" An echo server that uses select to handle multiple clients at a time. Entering any line of input at the terminal will exit the server. """ import select import socket import sys host = '' port = 50000 backlog = 5 size = 1024 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((host,port)) server.listen(backlog) input = [server,sys.stdin] running = 1 while running: inputready,outputready,exceptready = select.select(input,[],[]) for s in inputready: if s == server: # handle the server socket client, address = server.accept() input.append(client) elif s == sys.stdin: # handle standard input junk = sys.stdin.readline() running = 0 else: # handle all other sockets data = s.recv(size) if data: s.send(data) else: s.close() input.remove(s) server.close()
我收到错误消息(10038,“一个操作尝试了一些不是套接字的东西”)。 这可能与Python文档中的注释有关:“Windows上的文件对象是不可接受的,但套接字是在Windows上,底层的select()函数是由WinSock库提供的,不处理文件描述符,来自WinSock“。 在互联网上有很多关于这个话题的post,但是他们对我来说太技术了,或者根本就不清楚。 所以我的问题是:是否有任何方式可以在Windows下使用Python中的select()语句? 请添加一个小例子或修改上面的代码。 谢谢!
看起来像不喜欢sys.stdin
如果你改变输入这个
input = [server]
例外将消失。
这是来自文档
Note: File objects on Windows are not acceptable, but sockets are. On Windows, the underlying select() function is provided by the WinSock library, and does not handle file descriptors that don't originate from WinSock.
我不知道你的代码是否有其他问题,但是你得到的错误是因为将input
传递给select.select()
,问题是它包含了不是套接字的sys.stdin
。 在Windows下, select
只适用于套接字。
作为一个侧面说明, input
是一个python函数,将它作为变量使用并不是一个好主意。
当然,给出的答案是正确的…你只需要从输入中删除sys.stdin,但仍然在迭代中使用它:
对于输入准备+ [sys.stdin]中的s: