sokcet 断开重连问题

原创 2015年07月07日 11:31:38

    socket服务器已经断开而主项目这边完全不知道,如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。 

   首先想到socket类的方法isClosed()isConnected()isInputStreamShutdown()、 isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。 

   然后想到是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping,但是这样会影响到正常的输出数据,远端无法把正常数据和测试数据分开。 

    解决方法: 使用sendUrgentData,查看文档后得知它会往输出流发送一个字节的数据,只要对方SocketSO_OOBINLINE属性没有打开,就会 自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的。

我的重连类,需要拿来就能用。

public class IsAgainConnect implements Runnable {
 private static final boolean CONNECT = true;
 private static final int WAIT_TIME = 5000;

 private WifiLinking wifiLinking = null;

 public void run() {
  // TODO Auto-generated method stub
  reunion();
 }

 public IsAgainConnect(WifiLinking wifiLinking) {
  this.wifiLinking = wifiLinking;
  initiate();
 }

 // run方法
 private void reunion() {
  while (CONNECT) {
   holdTime(WAIT_TIME);
  }
 }

 // 等待时间
 private void holdTime(int time) {
  try {
   Thread.sleep(time);
  } catch (InterruptedException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  sendTestData();
 }

 // 发送测试数据
 private void sendTestData() {
  try {
   if (wifiLinking.socket != null) {
    wifiLinking.socket.sendUrgentData(0xFF);
   }
  } catch (IOException e) {
   handle();
  }
 }

 // 异常处理
 private void handle() {
  try {
   Looper.prepare();
   wifiLinking.socket = new Socket(WifiLinking.SERVER_IP,WifiLinking.SERVER_PORT);
   Toast.makeText(wifiLinking.context, "已重新与服务器连接!",Toast.LENGTH_LONG).show();
  } catch (Exception e1) {
   Toast.makeText(wifiLinking.context, "与服务器无连接!", Toast.LENGTH_LONG).show();
   initiate();
  }
  Looper.loop();
 }

 // 启动重连线程
 private void initiate() {
  Thread isAgainThread = new Thread(IsAgainConnect.this);
  isAgainThread.start();
 }

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Sokcet问题

进天遇到一个Sokcet问题,以下是有问题的代码 客户端: public class SocketClient { public static void main(String[] args) ...
  • mlh3823
  • mlh3823
  • 2012年09月27日 20:39
  • 667

空格&nbsp在不同浏览器中显示距离不一致问题解决方法

  在ie、firefox、chrome浏览器上显示的效果不太一样,主要是前面的空格宽度不同。网上资料说不同的浏览器会有不同的默认字体,一般 IE默认字体都是宋体,而firefox...

NIOS II常见编译问题解…

原文地址:II常见编译问题解答win7下的兼容性问题">NIOS II常见编译问题解答win7下的兼容性问题作者:SUN_403 cygdrive/f/altera/10.0/nios2eds/com...

iOS HR面试问题小集(以后看…

来到深圳准备面试,就在各个论坛和博客上收集了一些HR面的小问题,以后看到会续增补充滴~~~ 1.   请你自我介绍一下你自己? 回答提示:一般人回答这个问题过于平常,只说姓名、年龄、爱好、...

Innodb 没有主键的表插入性能问题

问题: 这几天发现客户那里的mysql集群有时插入特别的慢,通过慢查询日志以及pt-query-digest得知主要是对一张 表的插入特别的慢。 这张表的数据量大概有3百多万行,插入操作特别的频繁。 ...
  • gao1738
  • gao1738
  • 2015年01月18日 20:18
  • 387

规划问题 0-1型整数规划解法…

解0-1 型整数规划最容易想到的方法,和一般整数规划的情形一样,就是穷举法,即检查变量取值为0 或1 的每一种组合,比较目标函数值以求得最优解,这就需要检查变量取值的2的n次方个组合。对于变量个数n ...

IOS开发的一些技巧和常见问题 转

IOS开发的一些技巧和常见问题   1.什么时候该用ASIHTTPRequest,什么时候该用ASIFormDataRequest 如果是 Get ,或者参数可以简单的组成 Get 方式提交的时...

Solaris 常见问题问答

Solaris 常见问题问答1 1. Q: Solaris 的系统配置文件一般在什么地方? A: 可以查看/etc/system文件,里面有一些solaris启动时默认加载的选项,包括 共享内存...

安卓游戏常见问题 黑屏/闪退/…

如今安卓游戏的产量日渐增长,几乎每天都会出现各种各样有创意的小游戏或是动辄1个G以上的大型游戏,很多玩家满心欢喜下载完之后却出现了各种问题:无法安装、黑屏、闪退、停止运行等等,这种情况当然会令人大失所...

Chrome firefox ie等浏览器空格( )兼容问题

使用( ;)空格浏览器之间,显示的不一样,对不起等现象。解决方案:用半角空格 或者全角空格 就可以了, 相当于半格中文字符的宽度, 相当于一个中文字符宽...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sokcet 断开重连问题
举报原因:
原因补充:

(最多只允许输入30个字)