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

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

  •  
  •   atfeel · 2020-05-08 17:42:38 +08:00 · 4555 次点击
    这是一个创建于 1420 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    https://github.com/atfeel/test_Sock_Loop_Send_Pic

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

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

    第 1 条附言  ·  2020-05-09 14:40:16 +08:00
    因急用代码,没来得急翻 SOCKET 基础,现在已经搞定了,谢谢大家
    12 条回复    2020-05-09 11:00:42 +08:00
    atfeel
        1
    atfeel  
    OP
       2020-05-08 17:43:46 +08:00
    我现在可以确认一点是,while 循环,第一次执行到 inStream.read(buffer)的时候,后阻塞在这句,直到客户端发送数据,才会往下执行。

    但是关键是,处理完第一次后,新的一轮 while 循环到 inStream.read(buffer)的时候和第一次不一样,不阻塞了,理解不了
    n770011
        2
    n770011  
       2020-05-08 17:49:49 +08:00
    你客服端发送数据后就 close,既然都把 client 全局化了,就不该在一次业务中去 close client 。
    jinhan13789991
        3
    jinhan13789991  
       2020-05-08 17:53:32 +08:00
    129 行,os.close(); 你都关闭了还怎么接收。。
    atfeel
        4
    atfeel  
    OP
       2020-05-08 18:04:10 +08:00
    @jinhan13789991 去掉了 os.close();发送都不成功了!!
    zoharSoul
        5
    zoharSoul  
       2020-05-08 18:07:16 +08:00   ❤️ 1
    @atfeel 不要激动!!!
    fdppzrl
        6
    fdppzrl  
       2020-05-08 18:08:23 +08:00 via Android
    line106 stream.close 的问题。 做标记退出循环再关。或者 try-catch-finally 再关
    atfeel
        7
    atfeel  
    OP
       2020-05-08 18:10:43 +08:00
    @fdppzrl 不是呢
    atfeel
        8
    atfeel  
    OP
       2020-05-08 18:11:11 +08:00
    @n770011 去掉了 os.close();发送都不成功了!!没去掉的话第一次还是成功的
    CommandZi
        9
    CommandZi  
       2020-05-08 18:39:15 +08:00
    我感觉你还没理解网络字节流的工作方式,
    你可以自己定义一个结束符号跟在图片后面,遇到结束符号就读取下一段数据,
    或者在图片数据前面用固定个字节定义图片的数据长度,先读长度再根据长度读取图片。
    jinhan13789991
        10
    jinhan13789991  
       2020-05-09 09:26:55 +08:00
    楼上正解,原因就是你的程序正确区分两张图片内容。
    可以把 129 行的 os.close(); 注销掉。然后手动发送图片,等第一张图片接收成功了。等一会再发送第二张。
    这是通过时间来分割两张图片。。
    AoEiuV020
        11
    AoEiuV020  
       2020-05-09 10:54:21 +08:00
    close 换 flush 呢,
    AoEiuV020
        12
    AoEiuV020  
       2020-05-09 11:00:42 +08:00
    不是,看了下代码,直接删除 close 的话,服务端就可以继续读了,继续阻塞在 read, 你居然没有任何其他跳出循环的条件吗?
    一直卡在 read 不下去当然不会显示收到图片了,
    最简单做法是约定一个简单协议,比较一开始 4 个字节表示下一张图片的大小,服务端收到这么多字节就停止 read 跳出循环显示图片,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5764 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:11 · PVG 14:11 · LAX 23:11 · JFK 02:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.