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端 socket长连接 架构

看过包建强的《App研发录》之后对其中的基础Activity类封装感到惊讶,一直想找一种方式去解决关于app中使用socket长连接问题,如何实现简易的封装来达到主活动中涉及socket相关的代码量少...
  • li3007liuu
  • li3007liuu
  • 2016年10月07日 17:35
  • 8772

基于Java Socket的自定义协议,实现Android与服务器的长连接(一)

一、基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容...
  • u010818425
  • u010818425
  • 2016年12月02日 00:05
  • 5316

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

前面用golang写的socket服务端请移步:http://blog.csdn.net/u010072711/article/details/760821761. 把socket链接和心跳功能都放在...
  • u010072711
  • u010072711
  • 2017年07月25日 22:36
  • 3708

Android 使用Socket实现服务器与手机客户端的长连接八

一、发送请求的信息:1、接口 public interface Request { String getData(); }2、文本请求:public class TextRequest im...
  • lovoo
  • lovoo
  • 2016年08月02日 20:28
  • 3629

Android 使用Socket实现服务器与手机客户端的长连接六:二次封装

1、修改原来的连接器 1)在连接时发送信息给服务器 new Thread(new RequestWorker()).start();2)把验证码放入队列里public void auth(Str...
  • lovoo
  • lovoo
  • 2016年06月28日 22:37
  • 8852

android socket基于mina框架实现和服务器长连接

Android 基于mina框架实现和后台长连接 主要引入org.apache.mina 主要应用的场景,后台与服务器可以实时通信,实时交互,传输少量及时数据,多数场景传递预订好的指令 服务器需...
  • lushitianxia
  • lushitianxia
  • 2016年04月13日 20:51
  • 1552

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

在Android开发中,我们可能需要和服务器保持连接不断开,这时需要用到socket通信的长连接,并且定时发送消息检测是否是连接状态——心跳检测。 我们需要一个客户端和一个服务器端的...
  • JJ583500596
  • JJ583500596
  • 2017年08月02日 17:13
  • 967

Android中通过socket建立长连接实现推送功能

Android中通过socket建立长连接实现推送功能,当前需求服务器给客户端推送消息//输入的是服务器端的ip号 private String mIp; //进入首界面给服务器发送请求,拿到服务...
  • lamunuosang
  • lamunuosang
  • 2016年06月24日 15:41
  • 287

android Socket长连接及多客户端管理

一、简介 最近在做一个项目,需要用到socket 。具体功能为:在同一wifi下,一个手机作为服务器端,另一个(或多个)手机作为客户端,客户端自动获取服务器的ip,通过socket建立常连接,用客户端...
  • suyiyang888
  • suyiyang888
  • 2014年03月31日 15:26
  • 1851

Android产品研发(十二)-->App长连接实现

本文中我们将讲解一下App的长连接实现。一般而言长连接已经是App的标配了,推送功能的实现基础就是长连接,当然了我们也可以通过轮训操作实现推送功能,但是轮训一般及时性比较差,而且网络消耗与电量销毁比较...
  • qq_23547831
  • qq_23547831
  • 2016年06月17日 18:47
  • 33022
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android——Socket长连接
举报原因:
原因补充:

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