简单Python Echo服务器-参数错误

简单Python Echo服务器-参数错误,python,networking,Python,Networking,无论何时运行此代码,我都会收到while循环参数的以下错误消息: 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(5) input = [server,sys.stdin] ru

无论何时运行此代码,我都会收到while循环参数的以下错误消息:

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

如何修复此问题以使服务器正常运行?抱歉,如果这是一个糟糕的问题,我是python新手,无法理解这一点。谢谢。

是的,找到了解决您问题的方法。他们的问题似乎是
sys.stdin
,python空闲GUI出于某种原因不允许您在代码中使用
sys.stdin.fileno()
,而如果您在命令提示符或终端中运行它,它在linux上会正常工作

如果您使用windows,则无法将
sys.stdin
作为参数传递给select()函数,因为在windows中它只接受套接字作为参数。如文件中所述

注意:Windows上的文件对象是不可接受的,但套接字是可接受的。在Windows上,基础select()函数由WinSock库提供,不处理非源于WinSock的文件描述符

因此,为了缓解此问题,使其在windows和linux上都能工作:

inputready,outputready,exceptready = select.select(input,[],[])
TypeError: argument must be an int, or have a fileno() method.

请缩进代码。
input=[server,sys.stdin]
这一行的意思是什么?您使用的是什么操作系统?您是使用空闲的Python GUI还是通过终端运行它。
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) 
input1 = [server]
running = 1


while running: 
    inputready,outputready,exceptready = select.select(input1,[],[]) 

    for s in inputready: 

        if s == server: 
                # handle the server socket 
                client, address = server.accept()
                input1.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() 
                input1.remove(s) 
server.close()