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
snopy
V2EX  ›  Python

python socket 长连接

  •  
  •   snopy · 2015-06-25 18:04:12 +08:00 · 6625 次点击
    这是一个创建于 3426 天前的主题,其中的信息可能已经有所发展或是发生改变。

    python如何实现socket的长连接呢?有谁知道么?望指点迷津

    14 条回复    2015-06-27 20:06:06 +08:00
    bluehawk1030
        1
    bluehawk1030  
       2015-06-25 18:30:51 +08:00
    推荐看看一个项目 tornadio2, 基于tornado 的 socket.io server 实现,之前的一个项目中有采纳,单机跑1k 比较轻松。
    sillyousu
        2
    sillyousu  
       2015-06-25 19:15:29 +08:00
    我前段时间写了个 demo 。 基于 tornado。
    https://github.com/sillyousu/dummy_game/blob/master/client.py
    mhycy
        3
    mhycy  
       2015-06-25 20:09:16 +08:00   ❤️ 1
    TCP Socket长连接无法保证,因为有奇葩网关会不发RST截断数据流。
    对于这种已经断掉的数据流来说,底层的Socket会阻塞在read上。
    (情况与断网类似,需要等待TCP超时)

    具体长连接实现与应用环境有关,请提供应用场景以作判断。
    一般建议手工发送keepalive数据以维持连接。
    (那种奇葩网关也会忽略TCP的keepalive包,所以要手工发)
    snopy
        4
    snopy  
    OP
       2015-06-25 22:29:34 +08:00
    @bluehawk1030 @mhycy @sillyousu 感谢各位的建议,之前我找到的资料包括:
    https://delog.wordpress.com/2013/08/16/handling-tcp-keepalive/
    http://pythonhosted.org/pulsar/apps/socket.html
    不知道你们是否了解?关键是我不知道怎么用
    sillyousu
        5
    sillyousu  
       2015-06-26 00:17:21 +08:00
    @snopy 你的具体问题是什么?获取描述一个用例?
    pubby
        6
    pubby  
       2015-06-26 00:45:40 +08:00 via Android
    传输流还是消息?后者直接用Web socket不是更简单吗
    mhycy
        7
    mhycy  
       2015-06-26 08:56:14 +08:00
    @snopy
    应用场景呢?不然我们怎么告诉你怎么用。。囧
    snopy
        8
    snopy  
    OP
       2015-06-26 11:02:39 +08:00
    @sillyousu 就是客户端向服务端发出一个请求,然后建立一个socket,且一直保持连接,以便服务端向客户端推送消息,直到客户端主动请求退出连接
    snopy
        9
    snopy  
    OP
       2015-06-26 11:04:22 +08:00
    @pubby 有相应的参考资料么?
    @mhycy 问题描述见8楼,谢谢
    mhycy
        10
    mhycy  
       2015-06-26 11:13:00 +08:00
    @snopy
    场景是web,还是其他?
    web的话不建议这么做,其他环境自行定断,原因都是防火墙/NAT截断数据流
    另外你给的说明几乎是没任何帮助意义的。。
    因为涉及到不同的环境不同的场景对包的处理方式有所不同。
    最简单就是开个SOCKET并且设定SO_KEEPALIVE。
    但对于KEEPALIVE的一些参数,如检测间隔重试次数等的设定,在win和linux是不同的。

    另:这种方式在复杂的网络环境下不保证可用,但这是最简单的做法。
    连接本身一直不close就是长连接了,但往细的说这是个坑,要考虑的事情还挺多的。
    BeginMan
        11
    BeginMan  
       2015-06-26 13:26:42 +08:00
    python socket.io
    mengzhuo
        12
    mengzhuo  
       2015-06-26 15:13:09 +08:00
    最简单的实现:

    import socket
    s = socket.socket()
    s.bind(("0.0.0.0",12345))
    s.listen(0)
    c, _ = s.accept()
    while True:
    print c.recv(1024)
    mengzhuo
        13
    mengzhuo  
       2015-06-26 15:13:58 +08:00
    不过一般人都用gevent之类的async库~
    yuyang
        14
    yuyang  
       2015-06-27 20:06:06 +08:00
    一般来说python就tornado和gevent两个选择, 我个人觉得gevent写起来更舒服
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3002 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:37 · PVG 21:37 · LAX 05:37 · JFK 08:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.