android——Socket长连接

转载 2015年07月08日 16:35:13
///////////把MyType的一些方法替换成Writer的方法
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.net.InetAddress;
  import java.net.Socket;
  import java.net.UnknownHostException;

  import sean.Sysout;
  import sean.business.BusinessCenter;
  import sean.business.LoginManager;
  import sean.format.MyType;
  import sean.io.Reader;
  import sean.transfer.BytesBuffer;
  import sean.transfer.DataCenter;

  public class SocketThread implements Runnable {

  String Server = "";
  int Port = 0;
  static Socket cs = null;
  // Thread ioThread=null;
  static boolean bool_SocketThread = false;
  static OutputStream output = null;

  public SocketThread(String server, int port) {
  Server = server;
  Port = port;
  bool_SocketThread = true;
  }

  @Override
  public void run() {
  // TODO Auto-generated method stub
  while (bool_SocketThread) {
  try {
  // if (cs == null) {
  DataCenter.setBool_Login(false);// 设置登录失败
  Sysout.println("正在尝试连接ClientSocket...", Sysout.TempOutDebug);
  cs = new Socket(InetAddress.getByName(Server), Port);
  if (cs != null) {
  Sysout.println("ClientSocket连接成功!__" + cs,
  Sysout.TempOutDebug);
  cs.setKeepAlive(true);//让socket保持活动状态

  InputStream input = cs.getInputStream();
  output = cs.getOutputStream();
  BusinessCenter.sendLoginData();

  BytesBuffer bBuffer = new BytesBuffer();
  byte[] Buffer = new byte[1024];
  int ReadBytes = input.read(Buffer);
  while (ReadBytes != -1) {
  Sysout.println("已读取" + ReadBytes + "个字节到缓冲区",
  Sysout.TempOutDebug);
  byte[] b = new byte[ReadBytes];
  b = MyType.BytesInsertToBytes(Buffer, b, 0);
  Reader r = new Reader(b);
  Sysout.println(r.toString() + "____ReadBytes=="
  + ReadBytes, Sysout.TempOutDebug);
  bBuffer.InsertToBuffer(Buffer, ReadBytes);
  ReadBytes = input.read(Buffer);
  }
  } else {
  Sysout.printException("ClientSocket连接失败!请确认网络正常且服务器已开启。");
  }
  // }
  // 执行到这里说明inputstream.read()已中断,说明socket已断开连接
  // cs=null;
  LoginManager.setLoginValue(-1);// 业务中心登录注销,即登录管理器注销登录
  DataCenter.setBool_Login(false);// 数据中心登录注销
  Sysout.printException(cs + "已断开。");
  Thread.sleep(2 * 1000);// 睡眠2秒后继续循环

  // try {
  // // 判断ClientSocket是否已断开
  // cs.sendUrgentData(0);
  // } catch (IOException e) {
  // // TODO Auto-generated catch block
  // Sysout.printException("ClientSocket已断开,重新连接。"+e);
  // cs.close();
  // cs = null;
  // }
  } catch (UnknownHostException e) {
  // TODO Auto-generated catch block
  Sysout.printException("SocketThread.java====解析服务器名称发生异常!" + e);
  // e.printStackTrace();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  Sysout.printException("SocketThread发生IO异常,异常消息:" + e);
  try {
  if (cs != null) {
  Sysout.println("准备关闭" + cs, Sysout.TempOutDebug);
  cs.shutdownOutput();
  cs.shutdownInput();
  cs.close();
  cs = null;
  output = null;
  LoginManager.setLoginValue(-1);// 业务中心登录注销,即登录管理器注销登录
  DataCenter.setBool_Login(false);// 数据中心登录注销
  Sysout.println(cs + "已关闭。", Sysout.TempOutDebug);
  }
  try {
  Thread.sleep(5000);
  } catch (InterruptedException e2) {
  // TODO Auto-generated catch block
  Sysout.printException("SocketThread.java====线程睡眠异常!!"
  + e2);
  // e2.printStackTrace();
  }
  String ExceptionInfos=e.toString();
  if(ExceptionInfos.endsWith("Connection refused")){
  stopSocketThread();
  }
  } catch (IOException e1) {
  // TODO Auto-generated catch block
  Sysout.printException(cs + "关闭发生异常::" + e1);
  // e1.printStackTrace();
  try {
  Thread.sleep(5000);
  } catch (InterruptedException e2) {
  // TODO Auto-generated catch block
  Sysout.printException("SocketThread.java====线程睡眠异常!!"
  + e2);
  // e2.printStackTrace();
  }
  }
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  }// while(bool_SocketThread)
  Sysout.println("SocketThread已停止。", Sysout.TempOutDebug);
  }

  public static Socket getSocket() {
  return cs;
  }

  // public void setBool(boolean bool0) {
  // bool_SocketThread = bool0;
  // }

  public static OutputStream getOutputStream() {
  return output;
  }

  public static void stopSocketThread() {
  try {
  // 停止SocketThread线程,必须先把循环的标志bool_SocketThread置为false,否则可能继续循环,重新建立socket连接
  bool_SocketThread = false;
  // 关闭socket
  if (cs != null) {
  cs.shutdownOutput();
  cs.shutdownInput();
  cs.close();
  cs = null;
  output = null;

  Sysout.println("ClientSocket已被强制关闭。");
  //				LoginManager.setLoginValue(-1);// 业务中心登录注销,即登录管理器注销登录
  //				DataCenter.setBool_Login(false);// 数据中心登录注销
  //				byte[] lock=LoginActivity.getLock();
  //				synchronized(lock){
  //					lock.notify();
  //				}
  }
  } catch (IOException e) {
  // TODO Auto-generated catch block
  Sysout.printException("强制关闭" + cs + "发生异常::" + e);
  // e.printStackTrace();
  }
  }

  }

  必须先在android里启动一个服务,由服务去启动这个socket线程,因为如果是UI去启动的话,页面会卡住。。。

相关文章推荐

Android开发——本机Tomcat搭建服务器,客户端socket网络连接不上问题以及D-LINK端口转发设置

我是用自己的电脑搭建服务器,首先问题是我们需要在路由器上端口映射,外网才能访问到自己的电脑,如何端口映射可以看看这篇文章: http://blog.csdn.net/zhoubin1992/artic...

TCP/IP,http,socket,长连接,短连接——小结。

thomescai http://blog.csdn.net/thomescai(转载请保留) Socket是什么呢?     Socket是应用层与TCP/IP协议族通信...
  • cjsycyl
  • cjsycyl
  • 2013年03月14日 16:59
  • 722

TCP/IP,http,socket,长连接,短连接——小结。

thomescai http://blog.csdn.net/thomescai(转载请保留) 概要:     之前对这几个概念有点糊涂,查阅了些资料,稍微概括下他们的区别吧。如有错误,请拍~~~ ...

TCP/IP,http,socket,长连接,短连接——小结

TCP/IP,http,socket,长连接,短连接——小结 thomescai http://blog.csdn.net/thomescai(转载请保留) 概要: ...

基于Socket的TCP长连接(服务端Java+客户端Android),Service配合AIDL实现

最近公司的项目要求加入消息推送功能,由于项目用户量不是很大,推送需求不是很严格,而且是基于内网的推送,所以我舍弃了使用三方的推送服务,自己使用Socket写了推送功能,剪出一个小Demo来跟大家分享一...

Android的socket通信的长连接,有心跳检测

在Android开发中,我们可以需要和服务器保持连接不断开,这是需要用到socket通信的长连接,并且定时发送消息检测是否是连接状态——心跳检测。         我们需要一个客户端和一个服务器端的d...

Android多页面切换,保持Java中Socket长连接之静态方法

前段时间做一个安卓APP,真是有点折磨人,就是在多页面切换时socket不能保持长连接,最后的办法是我把服务器端换了,换成了我自己写的程序,然后让服务器妥协才搞定,这次做项目又用到的socket,就不...

Socket长连接Android端心跳机制实现

前面用golang写的socket服务端请移步:http://blog.csdn.net/u010072711/article/details/760821761. 把socket链接和心跳功能都放在...

Android 使用Socket实现服务器与手机客户端的长连接五:使用队列封装请求

一、概述:1、把发送者发送的信息全部封装在blockqueue队列里,然后使用connManager把队列里的信息取出,分发出去 2、原理图: 二、实现:/** * @描述 使用socket实现...
  • lovoo
  • lovoo
  • 2016年06月27日 22:54
  • 2084
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android——Socket长连接
举报原因:
原因补充:

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