Android 的 Socket 接收图片,只成功一次,是哪里写错了吗?

2020-05-08 17:42:38 +08:00
 atfeel

Android 的 Socket 接收图片,第一次接收图片会在 inStream.read(buffer)这行阻塞等待数据,正常接收到图片后,第二次接收图片,这句直接返回-1,不阻塞了,所以这段代码只能试一次性的,如何让他接收完第一张图后,继续等待第二张图呢,这个循环接收怎么写的。

https://github.com/atfeel/test_Sock_Loop_Send_Pic

我就是想实现 不关闭客户端连接的情况下,服务端循环接收客户端发送的图片。

哪位 V 友能帮调整下吗?我弄了半天没搞明白

8866 次点击
所在节点    Android
12 条回复
atfeel
2020-05-08 17:43:46 +08:00
我现在可以确认一点是,while 循环,第一次执行到 inStream.read(buffer)的时候,后阻塞在这句,直到客户端发送数据,才会往下执行。

但是关键是,处理完第一次后,新的一轮 while 循环到 inStream.read(buffer)的时候和第一次不一样,不阻塞了,理解不了
n770011
2020-05-08 17:49:49 +08:00
你客服端发送数据后就 close,既然都把 client 全局化了,就不该在一次业务中去 close client 。
jinhan13789991
2020-05-08 17:53:32 +08:00
129 行,os.close(); 你都关闭了还怎么接收。。
atfeel
2020-05-08 18:04:10 +08:00
@jinhan13789991 去掉了 os.close();发送都不成功了!!
zoharSoul
2020-05-08 18:07:16 +08:00
@atfeel 不要激动!!!
fdppzrl
2020-05-08 18:08:23 +08:00
line106 stream.close 的问题。 做标记退出循环再关。或者 try-catch-finally 再关
atfeel
2020-05-08 18:10:43 +08:00
@fdppzrl 不是呢
atfeel
2020-05-08 18:11:11 +08:00
@n770011 去掉了 os.close();发送都不成功了!!没去掉的话第一次还是成功的
CommandZi
2020-05-08 18:39:15 +08:00
我感觉你还没理解网络字节流的工作方式,
你可以自己定义一个结束符号跟在图片后面,遇到结束符号就读取下一段数据,
或者在图片数据前面用固定个字节定义图片的数据长度,先读长度再根据长度读取图片。
jinhan13789991
2020-05-09 09:26:55 +08:00
楼上正解,原因就是你的程序正确区分两张图片内容。
可以把 129 行的 os.close(); 注销掉。然后手动发送图片,等第一张图片接收成功了。等一会再发送第二张。
这是通过时间来分割两张图片。。
AoEiuV020
2020-05-09 10:54:21 +08:00
close 换 flush 呢,
AoEiuV020
2020-05-09 11:00:42 +08:00
不是,看了下代码,直接删除 close 的话,服务端就可以继续读了,继续阻塞在 read, 你居然没有任何其他跳出循环的条件吗?
一直卡在 read 不下去当然不会显示收到图片了,
最简单做法是约定一个简单协议,比较一开始 4 个字节表示下一张图片的大小,服务端收到这么多字节就停止 read 跳出循环显示图片,

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

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

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

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

© 2021 V2EX