python如何实现socket的长连接呢?有谁知道么?望指点迷津
1
bluehawk1030 2015-06-25 18:30:51 +08:00
推荐看看一个项目 tornadio2, 基于tornado 的 socket.io server 实现,之前的一个项目中有采纳,单机跑1k 比较轻松。
|
2
sillyousu 2015-06-25 19:15:29 +08:00
我前段时间写了个 demo 。 基于 tornado。
https://github.com/sillyousu/dummy_game/blob/master/client.py |
3
mhycy 2015-06-25 20:09:16 +08:00 1
TCP Socket长连接无法保证,因为有奇葩网关会不发RST截断数据流。
对于这种已经断掉的数据流来说,底层的Socket会阻塞在read上。 (情况与断网类似,需要等待TCP超时) 具体长连接实现与应用环境有关,请提供应用场景以作判断。 一般建议手工发送keepalive数据以维持连接。 (那种奇葩网关也会忽略TCP的keepalive包,所以要手工发) |
4
snopy OP @bluehawk1030 @mhycy @sillyousu 感谢各位的建议,之前我找到的资料包括:
https://delog.wordpress.com/2013/08/16/handling-tcp-keepalive/ http://pythonhosted.org/pulsar/apps/socket.html 不知道你们是否了解?关键是我不知道怎么用 |
6
pubby 2015-06-26 00:45:40 +08:00 via Android
传输流还是消息?后者直接用Web socket不是更简单吗
|
8
snopy OP @sillyousu 就是客户端向服务端发出一个请求,然后建立一个socket,且一直保持连接,以便服务端向客户端推送消息,直到客户端主动请求退出连接
|
10
mhycy 2015-06-26 11:13:00 +08:00
@snopy
场景是web,还是其他? web的话不建议这么做,其他环境自行定断,原因都是防火墙/NAT截断数据流 另外你给的说明几乎是没任何帮助意义的。。 因为涉及到不同的环境不同的场景对包的处理方式有所不同。 最简单就是开个SOCKET并且设定SO_KEEPALIVE。 但对于KEEPALIVE的一些参数,如检测间隔重试次数等的设定,在win和linux是不同的。 另:这种方式在复杂的网络环境下不保证可用,但这是最简单的做法。 连接本身一直不close就是长连接了,但往细的说这是个坑,要考虑的事情还挺多的。 |
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) |
13
mengzhuo 2015-06-26 15:13:58 +08:00
不过一般人都用gevent之类的async库~
|
14
yuyang 2015-06-27 20:06:06 +08:00
一般来说python就tornado和gevent两个选择, 我个人觉得gevent写起来更舒服
|