我试图在
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文档中的the remark有关,“Windows上的文件对象是不可接受的,但套接字是.在Windows上,底层的select()函数由WinSock库提供,并且不处理不具有的文件描述符来自WinSock.“在互联网上有很多关于这个主题的帖子,但它们对我来说太技术或者根本不清楚.所以我的问题是:有没有什么方法可以在Windows下使用python中的select()语句?请添加一些示例或修改上面的代码.谢谢!
看起来它不喜欢sys.stdin
如果您将输入更改为此
- input = [server]
例外情况将会消失.
这是从the doc
- 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.