Android: ServerSocket 如何关闭正在阻塞的 accept()方法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
doublemark
V2EX    Android

Android: ServerSocket 如何关闭正在阻塞的 accept()方法

  •  
  •   doublemark 2018-11-13 17:06:40 +08:00 13384 次点击
    这是一个创建于 2529 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先说明一下,本人目前是一名硬件工程师,手头有个项目需要写一个简单的 Android 测试软件,和单片机控制的 WiFi 模块通讯,软件上为 Server 端,监听某一端口,单片机为 Client,过 TCP/IP 协议通讯,目前 app 端我用 Service 实现了把 Socket 封装起来,这样各个 activity 里都可以发送接收,后台 service 保持 socket 的连接。 界面上一个 startservice 的按钮,一个 stopservice 的按钮。 有个小问题,假如用户在打开了 startservice 按钮,又想关闭了,程序里 serversocket 在 accept 的时候已经阻塞了,该怎么关闭呢? 看过几个回答,csdn 也好,google 的也好,都没能实现。前来 V2EX 寻求高人指点。多谢各位。

    5 条回复    2018-11-14 08:35:56 +08:00
    BBCCBB
        1
    BBCCBB  
       2018-11-13 17:10:12 +08:00
    另开一个线程调用 socket.close() ??

    这样 accept 的地方就会出现一个异常, catch 这个异常处理就 ok 了吧
    doublemark
        2
    doublemark  
    OP
       2018-11-13 17:14:25 +08:00
    @BBCCBB 感谢回复。

    试过在另一个线程里 close,也在 accept 里 catch 到这个异常了,到这里的话怎么办? catch 到了之后怎么处理呢?
    nicevar
        3
    nicevar  
       2018-11-13 17:34:37 +08:00
    正确的办法应该是用线程管理,如果 service 没有必要停止就一直开启, 自己做一个管理器进行通信管理
    就是说 accept 阻塞了就让它在那个线程一直跑着,别管它就行了,应用层就这么处理
    所以有时候应用层也很无奈,以前 mtk 的底层播放器 stop 函数会经常卡住,理论上正确的逻辑 stop 应该在 UI 线程调用,应该要立即返回的,一旦卡住就会导致程序 ANR 了,这时候你用线程异步去 stop 虽然能避开这个坑,但是逻辑上是有问题的,比如一些芯片不能实例化多个多播放器,直接导致播放器状态出错
    BBCCBB
        4
    BBCCBB  
       2018-11-13 17:39:12 +08:00
    @doublemark catch 到异常后说明 socket 关闭了, 你想关闭的愿望也就实现了

    你后面的逻辑是啥就继续写代码处理就对了啊.
    doublemark
        5
    doublemark  
    OP
       2018-11-14 08:35:56 +08:00
    @BBCCBB 感谢,在停止服务的时候加上了个结束 socket 的线程,然后在 accept 里捕获异常后处理好了。
    关于     帮助文档     自助推广系统     博客     API   &nsp; FAQ     Solana     1120 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 17:56 PVG 01:56 LAX 10:56 JFK 13:56
    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