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 断开重连问题

socket服务器已经断开而主项目这边完全不知道,如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。     首先想到socket类的方法isClosed()、isConnected()...
  • oMartin1
  • oMartin1
  • 2015年07月07日 11:31
  • 301

sokcet 断开重连问题

socket服务器已经断开而主项目这边完全不知道,如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。     首先想到socket类的方法isClosed()、isConnected...
  • yihui8
  • yihui8
  • 2014年08月28日 22:54
  • 1475

C++ SOCKET 断线重连的一个例子

// WindowsSocketServer.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include...
  • woaitingting1985
  • woaitingting1985
  • 2016年09月20日 21:44
  • 2950

当网络中断后,MQTT自动重连

最近因为工作需要,需要使用C# 语言编写一个通过MQTT协议 ,上传数据到云端的工具。因为之前没有用过MQTT,所以 使用的时候遇到很多问题.下面将会把我遇到的问题一一解释。 1.引用源码库地址...
  • lxrj2008
  • lxrj2008
  • 2017年07月25日 14:17
  • 3146

Windows wifi总是自动断开后重连

问题 几分钟 或 十几分钟 wifi就自动断开,然后自动重连。  解决方法 更改电源选项 更改适配器设置  详细方法 更改电源选项 打开【控制面板】点击【电源选项】 修改...
  • win_turn
  • win_turn
  • 2017年07月04日 16:10
  • 575

C3P0,Proxool,BoneCP,Druid等连接池的断开自动重联功能

数据库连接池的断开自动重联、失败恢复功能显得很重要,不知道目前主流的数据库连接池:C3P0,Proxool,BoneCP,Druid等支持如何? 我知道的: Proxool: ? ...
  • ye1992
  • ye1992
  • 2015年01月14日 13:21
  • 5080

【python】mysql断开重连

后台服务在运行时发现一个问题,运行约15分钟后,接口请求报错pymysql.err.InterfaceError: (0, '')定位问题时发现pymysql.err.OperationalError...
  • lluozh2015
  • lluozh2015
  • 2017年11月01日 11:06
  • 841

网狐框架问题之——莫名断线

在TableFrameSink中对Socket读取事件的处理结果如果为false,则服务器强制用户断线(服务器主动关闭了TCP连接);...
  • hnyzyty
  • hnyzyty
  • 2015年09月11日 16:08
  • 567

Socket 断线重连问题

上篇文章是关于Socket创建可Socket数据处理在这里: ☞ 利用GCDSocket 创建Socket ☞ 处理Socket数据粘包问题 关于断线重连的思路大概如下 当与服务器断开连接或...
  • u013282507
  • u013282507
  • 2016年09月22日 14:10
  • 7109

Android手机靠近蓝牙模块自动连接蓝牙模块,断后自动重连。也可以手机靠近手机自动连接。连接成功率百分之百,可后台运行

全球首创的新技术。小黄人独家推出基于bluetoothchat的,手机靠近蓝牙模块自动连接蓝牙模块,断后自动重连,多设备自由切换,记忆连接,可后台运行。连接成功率百分之百。可以应用在工业通讯,手机游戏...
  • chenhao0568
  • chenhao0568
  • 2015年12月05日 20:54
  • 1152
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sokcet 断开重连问题
举报原因:
原因补充:

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