Python服务器出现问题

Python服务器出现问题,python,sockets,keep-alive,Python,Sockets,Keep Alive,我有几个测试客户每次都遇到相同的问题。客户端可以连接,并且可以发送第一条消息,但之后服务器停止响应该客户端。我怀疑这个问题与s.accept()有关,但我不确定到底是哪里出了问题,也不确定如何解决 def startServer(): host = '' port = 13572 backlog = 5 size = 1024 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind

我有几个测试客户每次都遇到相同的问题。客户端可以连接,并且可以发送第一条消息,但之后服务器停止响应该客户端。我怀疑这个问题与s.accept()有关,但我不确定到底是哪里出了问题,也不确定如何解决

def startServer():
    host = ''
    port = 13572
    backlog = 5
    size = 1024

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host,port))
    s.listen(backlog)

    print "Close the command prompt to stop Gamelink"

    while 1:
        try:
            client, address = s.accept()
            data = client.recv(size)
            if data:
                processData(data)
                client.send("OK")
            else:
                print "Disconnecting from client at client's request"
                client.close()
        except socket.error, (value, message):
            if s:
                print "Disconnecting from client, socket issue"
                s.close()
            print "Error opening socket: " + message
            break
        except:
            print "Gamelink encountered a problem"
            break
        print "End of loop"
    client.close()
    s.close()

该服务器旨在通过本地网络访问,它需要重量轻,响应速度快,因此如果其他实现(如基于线程的)更适合满足这些要求,请告诉我。预期的应用程序将用作远程游戏键盘,因此需要低资源使用率和高速度。

直接使用
套接字编写服务器将非常困难。正如Keith所说,您需要以某种方式多路连接,比如使用
select
poll
或threads或
fork
。您可能认为您只需要一个连接,但当出现故障且连接丢失时,您会怎么做?如果您的服务器尚未意识到连接丢失,它是否能够响应来自客户端的重新连接尝试

如果你的人际关系需要是基本的,你也许可以让其他人来为你处理所有倾听、接受和分叉的事情。您没有指定平台,但Mac OS和Linux上都有此类程序的示例。这些工具的详细信息有所不同,但基本上您可以在一些配置文件中配置它们,以侦听某些端口上的连接。当他们得到它时,他们负责建立连接,然后他们用
stdin
stdout
将程序对准套接字,这样你就可以简单地使用你可能已经知道的所有基本IO,比如
print
sys.stdin.read()

像xinitd和launchd这样的解决方案的问题在于,对于每个新连接,它们必须
fork()
exec()
一个新的程序实例。这些操作相对繁重,因此大量连接或高速新连接可能会达到服务器的限制。但更糟糕的是,由于每个连接都在一个单独的过程中,因此它们之间很难共享数据。此外,您可能会发现,在进程之间进行通信的大多数解决方案都涉及到一个问题,现在您又回到了使用
select
或线程或类似的方法进行多路复用的问题


如果这不能满足您的需求,我认为您最好学习使用更高级别的网络框架,它将处理您在使用
socket
时不可避免地遇到的所有问题。我建议的一个这样的框架是。除了处理处理连接的普通细节和在连接之间多路传输IO的更复杂任务外,您还将拥有一个庞大的工具库,使协议的实现变得更容易。

您应该将
接受
置于循环之外。此外,此服务器将只接受一个连接。如果您想要一台真正的服务器为多个客户端提供服务,则需要多路连接,例如使用
select
poll
。一个连接实际上非常适合我正在尝试的操作,而且似乎解决了我的问题。谢谢