V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qiayue
V2EX  ›  问与答

类似于共享单车这种很多设备通过 TCP Socket 连接服务器,向服务器发送数据的场景,服务器该如何处理?

  •  
  •   qiayue · 2017-04-07 16:31:52 +08:00 · 8924 次点击
    这是一个创建于 2575 天前的主题,其中的信息可能已经有所发展或是发生改变。
    而且为了能够通过服务器下发命令到设备,以及为了设备能够实时传数据到服务器,连接都是长连接,并不是用完就关。
    我现在用的方式是,来一个设备就开一个线程去处理,但是这样设备一多,内存占用就多。
    我服务器用的是 JAVA 开发的 Socket Server 。
    求思路,求框架。
    28 条回复    2017-04-09 16:09:54 +08:00
    manhere
        1
    manhere  
       2017-04-07 16:55:37 +08:00   ❤️ 1
    可以参考下推送系统的做法
    zts1993
        2
    zts1993  
       2017-04-07 16:57:44 +08:00   ❤️ 1
    搜 非阻塞 IO

    java 的话 先看 NIO 然后 netty 这样的框架。。
    一个连接一个线程是不行的。。。。。。。。。。。。
    fyyz
        3
    fyyz  
       2017-04-07 17:00:26 +08:00 via Android   ❤️ 1
    异步非阻塞 io
    tabris17
        4
    tabris17  
       2017-04-07 17:04:46 +08:00   ❤️ 1
    java 用 Netty 或者 Vert.x
    zonghua
        5
    zonghua  
       2017-04-07 17:19:17 +08:00 via iPhone   ❤️ 1
    用 Netty 实现 MQTT 协议
    wwqgtxx
        6
    wwqgtxx  
       2017-04-07 17:19:53 +08:00 via iPhone   ❤️ 1
    java 用 netty , golang 直接用 goroutine , python 用 gevent 或者 tornado
    VicYu
        7
    VicYu  
       2017-04-07 17:34:30 +08:00
    然后在 actor 化, 进入邪教
    shoaly
        8
    shoaly  
       2017-04-07 17:48:14 +08:00
    如果不是 "真实时" 消息, http 维护成本低太多了.
    wwqgtxx
        9
    wwqgtxx  
       2017-04-07 18:14:12 +08:00 via iPhone
    @shoaly 你要在单片机或者 esp8266 之类的设备上自己实现一个 http 协议栈么😱
    t123yh
        10
    t123yh  
       2017-04-07 18:41:49 +08:00 via Android
    @wwqgtxx 貌似直接 socket 收发字符串就可以了,也不复杂
    cevincheung
        11
    cevincheung  
       2017-04-07 18:49:49 +08:00
    -_- 现在单车都开始锁上加联网模块了吗?怎么联网的? GSM ?
    yangff
        12
    yangff  
       2017-04-07 18:50:42 +08:00 via Android
    @cevincheung 4g 吧
    bianhua
        13
    bianhua  
       2017-04-07 18:53:50 +08:00
    @t123yh

    其实是这样的:如果用 TCP 先实现个 HTTP 客户端(哪怕就是读连续两个\r\n ,完全不解析头,拿 FIN 当 EOF ),然后再在 HTTP 上实现类似 Websocket/Comet 的东西,肯定不如直接拿 TCP 传递通知方便+效率高,何况这可能是在单车附加的设备上。
    qiayue
        14
    qiayue  
    OP
       2017-04-07 18:55:19 +08:00
    @cevincheung 4G 物联网卡,但是你硬件里的上网模块可以用 4G 的也可以用 2G 的。
    移动的卡, 500M 流量, 5~9 块钱,看你拿的量多少
    gamexg
        15
    gamexg  
       2017-04-07 19:36:11 +08:00 via Android
    @wwqgtxx http 不麻烦, https ...
    server
        16
    server  
       2017-04-07 19:37:19 +08:00
    有个东西 叫 gps
    ryd994
        17
    ryd994  
       2017-04-07 22:03:01 +08:00 via Android
    关键是 event driven ,用 nio
    楼上说 http 也并非没有道理, HTTP 的话就可以让 HTTP 服务器在前面挡并发连接。至少 Nginx 是个现成的 event driven 。你的程序可以忽略网络部分。部分实现一个 HTTP/0.9 协议栈其实很简单,你只要保证自己能和自己的服务器通讯就好。
    最后,如果不是对实时性有高要求,也没有高频率的消息,真的没有必要长连接。否则客户端光是维持连接的流量就已经不少了。要么你别开 keepalive ,加大 timeout ,明显也不可取。
    qiayue
        18
    qiayue  
    OP
       2017-04-07 22:28:28 +08:00
    @ryd994 设备运行在两种状态,一种是 25 秒发一次心跳,另一种是每隔 2 秒发一次数据
    当然,最重要是的,服务器想要找设备的时候,需要随时能够找到
    所以,必须长连接
    qiayue
        19
    qiayue  
    OP
       2017-04-07 22:29:20 +08:00
    @server 通过 2G 网络或者 4G 网络连接服务器,向服务器发送设备的实时位置( GPS )
    zonghua
        20
    zonghua  
       2017-04-07 23:07:27 +08:00
    @qiayue
    @bianhua 窄带通信用 MQTT 最可靠最成熟
    wwqgtxx
        21
    wwqgtxx  
       2017-04-08 02:05:10 +08:00 via iPhone
    @t123yh 主要是必要性问题,在那种小内存,低速率的机器上实现 http 协议还不如在服务器上下功夫
    另外就是标准 http1.1 协议并不支持服务端主动推送消息,如果要自己实现类似于 websocket 协议的话,干嘛不直接用 socket 来的省事
    @ryd994 用 http 还有个小的蛋疼的问题,就是 http 的无状态性,换句话说如果用 http 通讯那么每次通讯必须带上机器的唯一编号,否则服务器根本没法识别客户端的对应关系,然后就需要在服务器端自己维持一个 session 池,这个工作貌似有点重复造轮子的感觉
    ryd994
        22
    ryd994  
       2017-04-08 02:05:57 +08:00 via Android
    @qiayue 那就上 polling 呗
    不过再提醒一下,数据断了的话,只要服务器没有主动发数据,连接表面上还是连着,你都不知道什么时候会报断开
    所以 keepalive 还是要开
    移动网络上的长连接……相当不靠谱
    loading
        23
    loading  
       2017-04-08 07:12:52 +08:00 via Android
    有用短信的……
    TangMonk
        24
    TangMonk  
       2017-04-08 07:55:30 +08:00 via Android
    Erlang 开源项目: http://emqtt.io
    firefox12
        25
    firefox12  
       2017-04-08 14:48:16 +08:00 via iPhone
    实现 http 并不难,你并不需要实现 http 的所有特性。如何节省电量,保持信道不被释放 减少重连才是关键 这些坑 微信都已经走过了
    firefox12
        26
    firefox12  
       2017-04-08 14:49:36 +08:00 via iPhone
    至于连接数什么的也并不难,单机 2 百万的话,现在的摩拜 不用 3 台服务器就够了
    ihuotui
        27
    ihuotui  
       2017-04-08 16:30:39 +08:00 via iPhone
    tdp 吧,协议复杂点了
    julyclyde
        28
    julyclyde  
       2017-04-09 16:09:54 +08:00
    @server 跟 GPS 有啥关系
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1877 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:25 · PVG 00:25 · LAX 09:25 · JFK 12:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.