热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java源代码:服务器端口多线程监听类示例

packagehjk.java;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;impo

package hjk.java;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.swing.JOptionPane;

public class ServerPortListener implements Runnable{
 /**
  * @keywords 自动化管理的 服务器端口多线程监听 工具类  
  * @status 可用  调试中
  * @future 下一步功能扩展: 连接数管理
  * @author Karl Jinkey  iamkarl@163.com 2010-05-20
  * @sample 使用样例: 
  *    ServerPortListener listener = new ServerPortListener(serverPort);
    Thread threadListener = new Thread(listener);
    threadListener.setDaemon(true); 
    threadListener.start();//启动一个监听器线程
    threadListener.join();//阻塞调用进程,等待客户端连接
    socket = listener.getSocket();//获得传入的连接
    if(socket==null){
     //TODO: 错误处理代码
    }else{
     //TODO: 进一步的Socket处理
    }
  */
 private static Integer objCount = 0;
 private static Map serverMap = Collections.synchronizedMap(new HashMap());
 private static Set socketSet = Collections.synchronizedSet(new HashSet());
 
 private ServerSocket server = null;
 private Socket socket = null;
 private short serverPort;
 public InfoMap lastError = new InfoMap();
 public ServerPortListener(short serverPort) {
  System.out.println(objCount);
  synchronized (objCount) {
   objCount++;
  }
  this.serverPort = serverPort;
 } 
 public Socket getSocket() {
  return socket;
 }

 public void setSocket(Socket socket) {
  this.socket = socket;
 }

 public short getServerPort() {
  return serverPort;
  
 }

 public void setServerPort(short serverPort) {
  this.serverPort = serverPort;
 }

 @Override
 public void run() {
  while(true){
   try {
    server = serverMap.get(serverPort);
    if(server!=null ){
     if(!server.isClosed()) break;//端口服务存在,跳出循环
     serverMap.remove(serverPort);
    }
    server = new ServerSocket(serverPort);
    serverMap.put(serverPort, server);
    server.setReuseAddress(true);
    break;
   } catch (IOException e) {
    //lastError.msg ="创建服务端口["+serverPort+"]时发生异常:"+e.toString();
    if(server!=null){
     try{
      server.close();
     }catch(IOException e2){
      lastError.msg ="关闭ServerSocket时发生异常:"+e2.toString();      
     }
    }
    int res = JOptionPane.showConfirmDialog(null,
      "创建服务端口["+serverPort+"]时发生异常:"+e.toString(), "错误提示:",JOptionPane.YES_NO_OPTION);
    if(res!=JOptionPane.YES_OPTION) {     
     return;
    }
    //System.gc();
    continue;
   }
   
  }
  
  while (true) {    
   try{
    //if(server.isBound()){//测试绑定状态:
     System.out.println("监听端口:"+serverPort);
     socket = server.accept();
     socketSet.add(socket);
     System.out.println("监听成功,启动服务,客户端IP:"+socket.getRemoteSocketAddress().toString());
     break;//监听到一个连接请求,跳出循环
//    }else{
//     server.close();
//     server = new ServerSocket(serverPort);
//     server.setReuseAddress(true);
//    }     
   }catch(Exception e){
    lastError.msg ="监听器异常终止:"+e.toString();
   }
  }
 }
 //释放资源:
 private void freeAll(){
  if(serverMap.size()!=0){
   Set set = serverMap.keySet();
   for(Short key:set){
    System.out.println("ser.close():"+objCount);
    ServerSocket ser = serverMap.get(key);
    if(ser!=null&&!ser.isClosed()){
     try{
      ser.close();
     }catch(IOException e){}
    }    
   }
  }
  if(socketSet.size()!=0){
   
   for(Socket so:socketSet){
    if(so!=null&&!so.isClosed()){
     try{
      so.close();
     }catch(IOException e){}
    }    
   }
  }  
 }
 @Override
 protected void finalize() throws Throwable {
  synchronized (objCount) {
   //System.out.println("objCount:"+objCount);
   objCount--;
   if(objCount==0){
    freeAll();
    super.finalize();
    return;
   }
  }
  if(socket!=null){
   if(!socket.isClosed()){
    try{
     socket.close();
    }catch(IOException e){}
   }
   socketSet.remove(socket);
  }
  super.finalize();
 }
}


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • Java编程思想一书中第21章并发中关于线程间协作的一节中有个关于汽车打蜡与抛光的小例子(原书的704页)。这个例子主要展示的是两个线程如何通过wait ... [详细]
author-avatar
捕鱼达人2502856571
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有