关于 Android Socket 通信的问题,求解答~ - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kgf0ry
V2EX    Android

关于 Android Socket 通信的问题,求解答~

  •  
  •   kgf0ry 2018-06-05 04:10:16 +08:00 via Android 12566 次点击
    这是一个创建于 2691 天前的主题,其中的信息可能已经有所发展或是发生改变。
    服务器端每隔一秒发送一组九个字节的数据。
    Android 客户端在工作线程中每隔 1s 去获取流数据。为什么每次建立连接之后只能获取一次数据?
    客户端是不是必须在死循环里边去获取数据?
    求大佬解答~或者提出更好的解决方案~谢谢~
    12 条回复    2018-06-05 21:22:15 +08:00
    opengps
        1
    opengps  
       2018-06-05 07:54:40 +08:00 via Android
    这 9 字节是携带信息的心跳数据吗?客户端应当失败多少次重新建立连接(公网质量很差,必须的操作)。服务端应当失败多少次踢出这条链接
    CrisTao
        2
    CrisTao  
       2018-06-05 09:30:04 +08:00
    socket 通信的话 netty 了解一下,表示我这就是用 netty+protobuf 做的 im
    自己写的话就开个线程去跑轮询吧
    momocraft
        3
    momocraft  
       2018-06-05 09:49:45 +08:00   1
    > 为什么每次建立连接之后只能获取一次数据

    从描述猜不出你做了什么,遇到了什么

    > 客户端是不是必须在死循环里边去获取数据

    不是。这只是最简单的方式,这个搞不定不必急着想别的。
    xuhaoyangx
        4
    xuhaoyangx  
       2018-06-05 10:03:23 +08:00
    @CrisTao #2 netty9 不是得 jdk7 吗,得 android 4.3 以上
    deadEgg
        5
    deadEgg  
       2018-06-05 10:13:07 +08:00
    长连接不会是只获取一次数据。

    检查一下通信的时候是服务器断开了还是客户端断开了?

    还是说操作逻辑上有问题。
    shyrock
        6
    shyrock  
       2018-06-05 10:30:35 +08:00
    只说 socket。。。到底是 tcp 还是 udp 啊,同步还是异步啊。。。
    CrisTao
        7
    CrisTao  
       2018-06-05 11:08:27 +08:00
    @xuhaoyangx #4 什么? netty 出到 9 了?我这最新也才是 4.1.25 的包,而且 netty 是 java 的 nio 框架,对 android 版本没要求的
    yazheng
        8
    yazheng  
       2018-06-05 11:32:15 +08:00
    只获取一次数据?连接之后就断了吗
    zhangdawei
        9
    zhangdawei  
       2018-06-05 13:57:06 +08:00
    @CrisTao 感觉 Android 的 socket 通信就上 netty,是不是有点重了,
    tcp 和 udp 都用过,没啥问题吧
    CrisTao
        10
    CrisTao  
       2018-06-05 14:19:01 +08:00
    @zhangdawei #9 emmm,要是对 apk 大小有要求的话,netty 确实有点重,毕竟一个 all jar 有 3M 左右去了
    我这边目前是用的 tcp,毕竟用 udp 做 im 稳定性实在不好把控
    xuhaoyangx
        11
    xuhaoyangx  
       2018-06-05 15:02:06 +08:00
    @CrisTao #7 sorry 看错了-。-
    bhagavad
        12
    bhagavad  
       2018-06-05 21:22:15 +08:00   1
    先回答你的问题:
    1、Android 客户端在工作线程中每隔 1s 去获取流数据。为什么每次建立连接之后只能获取一次数据?
    答:你理解错误,并不是每次连接建立后只能获取一次数据。

    2、客户端是不是必须在死循环里边去获取数据?
    答:不是。


    socket 狭义来讲,仅是一组 interface ;广义上来讲是一组工具,这组工具实现了上述的 interface,方便用来操作 tcp / udp。
    拿 tcp 来举例,连接建立需要三次握手,连接关闭需要四次挥手。连接建立后,你就可以收发数据,所以这条连接是可以被一直使用的,并不需要每次都建立一个新连接(特殊需求另说)。
    关于轮询方式,也有很多种,像 select、poll、epoll 等,至于区别,楼主可以直接 google。搞个线程死循环去读取数据,是最暴力的方式,楼主可以查询一下上述轮询的区别,然后按照自己需求选用。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6317 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 02:32 PVG 10:32 LAX 19:32 JFK 22:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86