被动端

来源:互联网 发布:mac日历收到垃圾邀请 编辑:程序博客网 时间:2024/04/26 07:42

  被动端

  被动端的核心是NiuxzServer和Worker和SocketHandler

  大概流程是开启端口等待连接、接受连接创建线程、达到线程最大数,拒绝连接、连接进入开始读取数据、读取到数据后进行分支处理,处理完后把结果响应到主动端,完成一次交互。继续读取。

  /**开启一个ServerSocket并等待连接,联入后开启一个线程进行处理**/

  class NiuxzServer{

  ServerSocket serverSocket;

  HashMap sockets = new HashMap();

  public static AtomicInteger workerCount = 0;

  public Object waitLock = new Object();

  int maxWorkerCount = 100;//允许100个连接进入

  int port;//配置一个端口号

  /**工作入口**/

  void work(){

  serverSocket = new ServerSocket(port);

  while(true){

  Socket socekt = serverSocket.accept();//阻塞等待连接

  NiuxzSocket niuxzSocket = new NiuxzSocket(socket);

  sockets.put(niuxzSocket ,1);//将连接放入map中

  Worker worker = new Worker(niuxzSocket );//创建一个工作线程

  worker.start();//开始线程

  while(true){

  if(workerCount.incrementAndGet()>=maxWorkerCount){//如果超过了规定的最大线程数,就进入等待,等待其他连接销毁

  synchronized(waitLock){

  if(workerCount.incrementAndGet()>=maxWorkerCount){//double check 确定进入等待前没有正在断开的socket

  waitLock.wait();

  }else{

  break;

  }

  }

  }else{

  break;

  }

  }

  }

  }

  /**销毁一个连接**/

  void destroy(NiuxzSocket socket){

  synchronized(waitLock){

  sockets.remove(socket);//从池子里删除

  workerCount.decrementAndGet();//当前连接数减一

  waitLock.notify();//通知work方法 可以继续接受请求了

  }

  }

  /**创建一个工作者线程类,处理连入的socket**/

  class Worker extends Thread{

  HashMap handlers;//针对每种行为标识做的消息处理器。

  NiuxzSocket socket;

  Worker(NiuxzSocketsocket){//构造函数

  this.socket = socket;

  }

  void run(){

  try{

  while(true){

  SocketPackage sp = SocketPackage.parse(socket.getIn());//阻塞读,直到读完一个消息包未知,这样可以解决粘包或半包的问题

  SocketHandler handler = handlers.get(sp.getAction());//根据行为标识获取响应的处理器

  handler.handle(sp,socket);//处理结果和响应信息都在handler中回写

  }

  }cache(Exception e){

  LOG.error("连接异常中断",e);

  NiuxzServer.destroy(socket);成都药流和人流哪个伤害小
成都九龙医院“二胎优生门诊”挂牌开诊
成都治疗宫颈疾病哪家好
成都男科医院排名
小便刺痛是什么病
成都九龙医院做男科检查好吗
成都做无痛人流好的医院
成都做包皮手术去哪家医院好
成都做无痛人流的好医院
成都割包皮需要多少钱
成都武侯治疗早泄哪个医院好?
成都武侯区那个医院做阴茎延长好
成都金牛治疗阳痿的医院?
成都金牛区附近哪里有治疗早泄的好医院
第一次流产可以做药流吗?
成都红瓦寺附近好的人流医院
成都双流哪个医院治早泄好?
成都龙泉哪家医院治疗阳痿效果好?
在成都双流附近的医院做人流需要多少钱?
成都火车北站旁边人流医院哪个好
成都龙泉驿做人流多少钱?
成都武侯区有哪些医院可以做无痛人流

  }

  }

  }

  }

  /** 创建一个消息处理器 SocketHandler 接收所有内容后 回显 **/

  class EchoSocketHandler implements SocketHandler {

  /** 处理socket请求 **/

  void handle(SocketPackage sp, NiuxzSocket socket) {

  sp.setAction(10);// 比如协议中的行为标识10是响应成功的意思

  socket.write(sp.toBytes());// 直接回写

  }

  }

  至此两端的工作代码已经初步完成。socket可以按照相互制定的通讯方式进行通讯了。

原创粉丝点击