主动端

来源:互联网 发布:linux下压缩文件夹命令 编辑:程序博客网 时间:2024/05/02 01:54

  主动端:

  主动端的核心是连接池SocketPool和SocketClient服务

  大概流程是调用SocketClient发送数据包,SocketClient从连接池中获取一个可用连接,如果没有可用连接,就创建一个。SocketClient根据业务类型或消息类型分别对NiuxzSocket进行操作。

  /** 封装一个发送信息的接口,提供常用的发送信息方法。 **/

  interface SocketClient {

  SocketPackage sendData(SocketPackage sp);// 发送一个消息包,并等待返回的消息包

  // TODO:还可以根据双方的业务和协议添加几个更方便使用的接口方法。比如只返回消息体字段,或者直接返回json内容的

  void sendHeartBeat(NiuxzSocket socket);// 发送一个心跳包,这个方法后面讲心跳包时会用到

  }

  class DefaultSocketClient implements SocketClient {

  SocketPool socketPool;// 先假装有一个socket连接池,用来管理socket。不使用连接池的话,在这里直接注入一个NiuxzSocket就可以了。下面代码中也直接使用socket,但是一定要在使用时进行加锁操作。否则就会造成多线程访问同一个socket导致数据错乱了。

  /** 此方法就是主动端工作入口了,业务代码可以直接调用这里进行发送数据 **/

  SocketPackage sendData(SocketPackage sp){

  NiuxzSocket niuxzSocket = socketPool.get();//获取一个socket,这里可以看到获取的socket并不是原生的socket,其实是我们自己封装后的socket

  try{

  niuxzSocket.write(sp.toBytes());//阻塞持续写到缓存中

  niuxzSocket.lastUse = System.currentTimeMillis();//根据业务方法更新socket的状态信息

  SocketPackage sp = SocketPackage.parse(niuxzSocket.getIn());//阻塞读,等待消息的返回,因为是单线程操作socket所以不存在消息插队的情况。

  return sp;

  }catch(Exception e){

  LOG.error("发送消息包失败",e);

  socketPool.destroy(niuxzSocket)

  //在发生不可复用的异常时才关闭socket,并销毁这个NiuxzSocke。不可复用异常意思是IO操作到了一半不知道具体到哪了所以整个socket都不可用了。

  }

  finally{

  if(socketPool!=null){

  socketPool.recycle(niuxzSocket );//使用完这个socket后我们不要关闭,因为还要复用,让连接池回收这个socket。recycle内要判断socket是否是销毁状态。

  }

  }

  }

  }成都哪家男科医院治疗阳痿好
成华区割包皮医院
成华区治疗早泄好的医院
温江区做人流哪家医院好点?
温江区做人流较佳时间
双流区怀孕多少天就不能打胎了
双流区无痛人流医院排名
锦江区做人流哪家医院好
锦江区治月经不调好的妇科医院
天府新区治盆腔炎专业的医院
成都妇科医院在线咨询
成都阴唇肥大手术多少钱
成都做阴道紧缩贵吗
成都小阴唇肥大手术哪个医院好
成都做处女膜得多少钱
成都小阴唇肥大治疗方法
成都九龙医院十项精品服务,让患者舒心就医
成都婚前检查项目及费用