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

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

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

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

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

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

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

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


socket 狭义来讲,仅是一组 interface ;广义上来讲是一组工具,这组工具实现了上述的 interface,方便用来操作 tcp / udp。
拿 tcp 来举例,连接建立需要三次握手,连接关闭需要四次挥手。连接建立后,你就可以收发数据,所以这条连接是可以被一直使用的,并不需要每次都建立一个新连接(特殊需求另说)。
关于轮询方式,也有很多种,像 select、poll、epoll 等,至于区别,楼主可以直接 google。搞个线程死循环去读取数据,是最暴力的方式,楼主可以查询一下上述轮询的区别,然后按照自己需求选用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/460413

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX