V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sbmzhcn
V2EX  ›  Python

python socket server 编程,阻塞问题

  •  
  •   sbmzhcn · 2014-12-10 23:27:16 +08:00 · 4202 次点击
    这是一个创建于 3640 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是不是阻塞我也不太清楚,我先描述下问题吧,对于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会每次都不一样的,我测试过。
    5 条回复    2014-12-15 09:10:14 +08:00
    mengskysama
        1
    mengskysama  
       2014-12-11 00:10:24 +08:00
    if len(data) == 0:
    break
    mengskysama
        2
    mengskysama  
       2014-12-11 00:12:50 +08:00
    <= 0
    allenforrest
        3
    allenforrest  
       2014-12-11 15:35:57 +08:00
    把 accept 的监听代码放在一个线程里,接收到一个成功连接就添加到一个 socket 队列里,主线程循环 select(或 epoll)所有 socket 队列,处理消息收发。
    julyclyde
        4
    julyclyde  
       2014-12-14 22:16:40 +08:00
    thread mixin class
    mengzhuo
        5
    mengzhuo  
       2014-12-15 09:10:14 +08:00
    一楼正解
    remote 自己断开时回发送FIN数据包,然后长度为0
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4430 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:08 · PVG 12:08 · LAX 20:08 · JFK 23:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.