Android 的 Socket 接收图片,只成功一次,是哪里写错了吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
atfeel
V2EX    Android

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

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

    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     Solana     5417 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 06:04 PVG 14:04 LAX 22:04 JFK 01:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86