V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kgf0ry
V2EX  ›  Android

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

  •  
  •   kgf0ry · 2018-06-05 04:10:16 +08:00 via Android · 9590 次点击
    这是一个创建于 2366 天前的主题,其中的信息可能已经有所发展或是发生改变。
    服务器端每隔一秒发送一组九个字节的数据。
    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   ·   实用小工具   ·   1054 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 22:36 · PVG 06:36 · LAX 14:36 · JFK 17:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.