首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python服务器的问题

Python服务器的问题
EN

Stack Overflow用户
提问于 2012-12-31 08:00:54
回答 1查看 158关注 0票数 1

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

代码语言:javascript
复制
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()

该服务器的目的是通过本地网络访问,它需要是轻量级和非常快速的响应,所以如果另一个实现(如基于线程)将更好地满足这些要求,请让我知道。预期的应用将被用作远程游戏键盘,因此需要低资源使用和高速度。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-31 12:21:31

直接使用socket编写服务器将很困难。正如基思所说,你需要以某种方式多路复用连接,比如使用selectpoll、线程或fork。您可能认为您只需要一个连接,但是当出现问题并且连接丢失时,您将如何处理?如果您的服务器还没有意识到连接丢失,它是否能够响应来自客户端的重新连接尝试?

如果你的网络需求是基本的,你也许可以让其他东西为你处理所有的倾听、接受和分叉。您没有指定平台,但这类程序的示例是Mac上的launchd和Linux上的xinetd。这些工具的细节有所不同,但基本上是在一些配置文件中对它们进行配置,以侦听某个端口上的连接。当他们得到它,他们负责建立连接,然后他们exec()你的程序与stdinstdout针对套接字,所以你可以简单地使用所有的基本IO,你可能已经知道像printsys.stdin.read()

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14095990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档