Android 的 Socket 接收图片,第一次接收图片会在 inStream.read(buffer)这行阻塞等待数据,正常接收到图片后,第二次接收图片,这句直接返回-1,不阻塞了,所以这段代码只能试一次性的,如何让他接收完第一张图后,继续等待第二张图呢,这个循环接收怎么写的。
https://github.com/atfeel/test_Sock_Loop_Send_Pic
我就是想实现 不关闭客户端连接的情况下,服务端循环接收客户端发送的图片。
哪位 V 友能帮调整下吗?我弄了半天没搞明白
1
atfeel OP 我现在可以确认一点是,while 循环,第一次执行到 inStream.read(buffer)的时候,后阻塞在这句,直到客户端发送数据,才会往下执行。
但是关键是,处理完第一次后,新的一轮 while 循环到 inStream.read(buffer)的时候和第一次不一样,不阻塞了,理解不了 |
2
n770011 2020-05-08 17:49:49 +08:00
你客服端发送数据后就 close,既然都把 client 全局化了,就不该在一次业务中去 close client 。
|
3
jinhan13789991 2020-05-08 17:53:32 +08:00
129 行,os.close(); 你都关闭了还怎么接收。。
|
4
atfeel OP @jinhan13789991 去掉了 os.close();发送都不成功了!!
|
6
fdppzrl 2020-05-08 18:08:23 +08:00 via Android
line106 stream.close 的问题。 做标记退出循环再关。或者 try-catch-finally 再关
|
9
CommandZi 2020-05-08 18:39:15 +08:00
我感觉你还没理解网络字节流的工作方式,
你可以自己定义一个结束符号跟在图片后面,遇到结束符号就读取下一段数据, 或者在图片数据前面用固定个字节定义图片的数据长度,先读长度再根据长度读取图片。 |
10
jinhan13789991 2020-05-09 09:26:55 +08:00
楼上正解,原因就是你的程序正确区分两张图片内容。
可以把 129 行的 os.close(); 注销掉。然后手动发送图片,等第一张图片接收成功了。等一会再发送第二张。 这是通过时间来分割两张图片。。 |
11
AoEiuV020 2020-05-09 10:54:21 +08:00
close 换 flush 呢,
|
12
AoEiuV020 2020-05-09 11:00:42 +08:00
不是,看了下代码,直接删除 close 的话,服务端就可以继续读了,继续阻塞在 read, 你居然没有任何其他跳出循环的条件吗?
一直卡在 read 不下去当然不会显示收到图片了, 最简单做法是约定一个简单协议,比较一开始 4 个字节表示下一张图片的大小,服务端收到这么多字节就停止 read 跳出循环显示图片, |