我有几个测试客户端每次都遇到相同的问题。客户机可以连接,并且可以发送第一条消息,但是在这之后,服务器将停止对该客户机的响应。我怀疑这个问题与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()
该服务器旨在通过本地网络访问,它需要重量轻,响应速度快,因此,如果其他实现(如基于线程的)将更好地满足这些要求,请让我知道。预期的应用是作为一个远程游戏键盘,因此需要低资源使用和高速度。在
直接使用}或线程或{}。你可能认为你只需要一个连接,但是当某个连接出现问题并且失去连接时,你会怎么做?如果您的服务器还没有意识到连接丢失,它是否能够响应来自客户端的重新连接尝试?在
socket
编写服务器将很困难。正如Keith所说,您需要以某种方式复用连接,比如使用select
或{如果你的人际网络需求是基本的,那么你也许可以让别的东西来帮你处理所有倾听、接受和分岔的事情。您没有指定平台,但是这类程序的例子有macos上的launchd和Linux上的xinetd。这些工具的细节有所不同,但基本上是在某些配置文件中配置它们,以侦听某个端口上的连接。当他们得到它的时候,他们负责建立连接,然后他们}瞄准了套接字,所以你可以简单地使用你可能已经知道的所有基本IO,比如}。在
exec()
你的程序,stdin
和{print
和{像xinitd和launchd这样的解决方案的问题是,对于每个新的连接,它们必须}程序的一个新实例。这些操作相对繁重,因此大量的连接或高速率的新连接可能会达到服务器的限制。但更糟糕的是,由于每个连接都在一个单独的进程中,因此很难在它们之间共享数据。另外,您可能会发现在进程之间通信的大多数解决方案都涉及blocking API,现在您又回到了使用
fork()
和{select
或线程或类似的复用问题。在如果这不能满足您的需求,我认为您最好学习使用一个更高级别的网络框架,它将处理您在走
socket
的道路时不可避免地遇到的所有问题。我建议的一个这样的框架是Twisted。除了处理处理连接的日常细节,以及在它们之间多路复用IO的更复杂的任务之外,您还将拥有一个巨大的工具库,这些工具将使您的协议的实现更加容易。在相关问题 更多 >
编程相关推荐