python socket server 编程,阻塞问题

2014-12-10 23:27:16 +08:00
 sbmzhcn
是不是阻塞我也不太清楚,我先描述下问题吧,对于socket编程也不太熟悉,只是参考资料自己试了下。
下面这代码当作服务器端DSC的代码,一直在等待另一客户端DTU发送数据。
HOST = '127.0.0.1'
PORT = 8089
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
sock.listen(5)

while True:
print "wating for connection..."
connection, address = sock.accept()
print "connected from", address
while True:
data = connection.recv(1024)
if not len(data):
continue

代码如上,执行的话是没有问题的,当客户端DTU一直send数据的时候。如果现在出现意外,客户端DTU断电或者其它情况数据中断发送一会,上面的代码就出错了,会一直不动。我想要的结果应该是DSC,就是上面的代码从connection, address = sock.accept() 重新执行一下,待DTU再重新发数据的时候我这边可以正常接收,现在如果我不重新执行代码的它就不会重新接收,等同于“卡死”在那儿。

不知道大家有没有听明白。上面的代码是DSC端。有一个DTU端一直在向DSC发送数据。DTU端是一个无线发送装置,不用关心,只知道它会不停的向DSC发送数据。 DTU随时会断电,所以要保证DSC能很好的处理各种情况,请教大家如何解决?


DTU每次发送数据时如果断电,connection, address = sock.accept() 接收到的address会每次都不一样的,我测试过。
4131 次点击
所在节点    Python
5 条回复
mengskysama
2014-12-11 00:10:24 +08:00
if len(data) == 0:
break
mengskysama
2014-12-11 00:12:50 +08:00
<= 0
allenforrest
2014-12-11 15:35:57 +08:00
把 accept 的监听代码放在一个线程里,接收到一个成功连接就添加到一个 socket 队列里,主线程循环 select(或 epoll)所有 socket 队列,处理消息收发。
julyclyde
2014-12-14 22:16:40 +08:00
thread mixin class
mengzhuo
2014-12-15 09:10:14 +08:00
一楼正解
remote 自己断开时回发送FIN数据包,然后长度为0

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/153004

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX