2015-09-04 35 views
0

我试图做一个套接字连接,以保持活着,以便在连接丢失的情况下。所以基本上我想保持服务器始终打开(最好是客户端),并在连接丢失后重新启动客户端。但如果一端关闭了两端关闭。我通过将两端都放在同一台计算机"localhost"上并单击X按钮来模拟此操作。这可能是我的问题的根源吗?在连接丢失的情况下保持python套接字活着

反正我的连接码 m.connect(("localhost", 5000)) 处于iftrywhile例如

while True: if tryconnection: #Error handeling try: m.connect(("localhost", 5000)) init = True tryconnection = False except socket.error: init = False tryconnection = True

而在我的代码的最后我只是一个m.send("example")当我按下一个按钮,如果返回一个错误的尝试重新连接到"localhost"启动代码。而服务器是一个非常通用的服务器设置,在x.accept()周围有一个while循环。那么在连接关闭时如何保持它们都处于活动状态,以便它们在重新打开时可以重新连接。或者,我的代码是否正常,它只是在同一台计算机上模拟而已?

+0

TCP无法“保持连接处于活动状态” - 所以至少有两个选项:1.使用无连接的UDP,并且在所有需要的层之上分层以使数据传输可靠并且流畅,控制(即复制相当多的TCP堆栈:-o或2)继续使用TCP,但在其上添加一个层,以便当客户端重新连接客户端时,将某些特定于客户端的信息(令牌/ cookie)提供给服务器允许服务器恢复以前的连接。这是您的浏览器可以使用cookie恢复与服务器的Web会话的方式。 – barny

+0

你有没有我如何添加图层的例子。我比较新。谢谢 – ferret249

+0

当客户端连接时,如果客户端没有保存,客户端会自动发送一条消息,说明'这是我过去的令牌'或'没有令牌'。在服务器上,对于新的TCP连接,等待令牌信息并验证令牌(例如,服务器是否有记录?是否不太旧?是否用户注销?)并进行适当处理。例如如果客户端已经注销,则用户需要重新进行身份验证。如果没有注销,则最近一次连接是最近的,然后恢复会话。这完全是*网站如何记住用户并在浏览器中使用cookie保留购物篮。 – barny

回答

1

我假设我们在这里处理TCP,因为你使用“连接”这个词。

这一切都取决于你的意思是“连接损失”。

如果出现连接丢失,则意味着服务器和客户端之间的数据交换可能会暂停/不响应(重要的是:我没有在这里说“关闭”)时间长,时间长或分钟长,你可以做的并不多,因为TCP协议经过精心设计,可以很好地处理这种情况。决定一方或另一方之前的超时肯定是下降,放弃,并关闭连接是很长的(分钟)。这种情况的例子:客户端是你的智能手机,连接到网络上的某个服务器,然后你进入一个长长的隧道。

但是,当你说:“但是,如果一端关闭两端关闭我模拟这个由同一台计算机上本地主机有两端,只需点击X按钮。”,你在做什么其实是关闭连接。

  • 如果突然终止服务器:在TCP/IP实现操作系统的都知道,有没有更多的监听端口5000的过程,将干净关闭该端口的所有连接。在这种情况下,客户端会发生一些TCP段交换(这是TCP 4路拆除或重置),并且所有客户端都将被拒绝。理解这一点很重要,这是在TCP/IP实现级别完成的,也就是说您的操作系统。

  • 如果突然终止客户端,因此,您的操作系统的TCP/IP实现将干净关闭从它连接的出口Y到你的服务器端口5000

  • 在这两种情况下/侧,在网络级别,就像您明确(不突然)关闭代码中的连接一样。

...一旦封闭,有没有办法你都不可能,因为他们之前重新建立这些连接。你必须建立新的联系。

如果你想建立这些新的连接并获得应用程序逻辑到之前的状态,那么现在就是另一个话题了。单凭TCP无法帮助你。您需要更高级别的协议,或许您自己的协议来实现有状态的客户端/服务器应用程序。

0

该问题与编程语言无关,在本例中为python。操作系统(Windows或Linux)对套接字的恢复程度有最后的评价。