本人在做一个点菜系统,之前采用的是短连接方式,由于用户体验比较差(采用3G网络,有的时候延时比较大),老板让我用长连接的方式与服务器连接,比短连接少了个Connection的过程,稍微快一些,但是也存在一些问题,比如网络状况不好,或者断掉,我把3G网络断掉又开启(程序开着),中间也没有捕获到异常,用socket.isConnected()显示是true,还有try{
      socket.sendUrgentData(0xFF);
}catch(Exception ex){
      reconnect();
}
也没捕获到异常,我是想如果检测出socket连接如果断掉的话就重新Connection一些,可是那些检测的方法貌似都不行,
socket.getInputStream() 和socket.getOutputStream()也都没有捕获到异常。请问有没有有效的检测socket连接异常的方法?如果哪位大侠用心跳的方法,能不能粘点代码,让小弟参考参考,谢了

解决方案 »

  1.   

    socket.sendUrgentData(0xFF);
    这句话要执行的时候才报异常,作用就是心跳包 一次发1k数据 需要写在循环里面 不断执行
    当你开着程序断掉网络的时候 他是肯定会报异常的 你再检查一下程序看有没有什么地方报异常跳过了这句话或是循环处在随眠状态,在断开网络的时候还在随眠而没有执行此句。
    实在不行 可以在客户端要与服务器通信写数据的时候捕获IO异常 outputstream在断开的时候必报的异常 这时候再重新与服务器连接并通信,毕竟这种断开也不是经常发生吧,连接的时候还是占多数时候。
    要不就新开一条线程,每隔几秒就向服务器发送一次数据,掉了就重连。
    代码的话,我找找先 。 反正这种长连接就是socket连接之后不断开 只用这一个实例与服务器通信
      

  2.   

    点菜系统我想一下   当点击上报的时候就与服务器通信,把要点的菜发送到服务器
    这个时候肯定要outputstream.write();
    如果socket断了  这句一定报IO异常  楼主试着捕获一下  捕获到就重连
      

  3.   

    outputstream.write();在3G网络环境下没有报异常,wifi效果很明显
      

  4.   

    3G网络是有一个问题  断开了不会马上报出异常  要等一会  有时候还很长  就算设置超时也不设太短
    那就只能采取向服务器发心跳包,也就是每2秒发一条固定数据,服务器接到后返回固定数据,如果客户短5秒内每有接收到服务器的返回 就主动断开此次连接 并 重新连接 (不过这样有可能废流量 最好好好计算下。)我做过一个项目也是3G网络通信 访问webservices的 要求没有点菜实时性高 而且环境是在室外 信号很强 网络状况都很好 而且就算一次通信失败 再次通信就行了 =,= 所以我只能提供点思路 没有代码 就想帮忙
      

  5.   

    outputstream.write();在3G网络环境下没有报异常,wifi效果很明显