1. 程式人生 > >Java原始碼:伺服器埠多執行緒監聽類示例

Java原始碼:伺服器埠多執行緒監聽類示例

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 

[email protected] 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<Short, ServerSocket> serverMap = Collections.synchronizedMap(new HashMap<Short, ServerSocket>());
 private static Set<Socket> socketSet = Collections.synchronizedSet(new HashSet<Socket>());
 
 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<Short> 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();
 }
}

相關推薦

Java原始碼伺服器執行示例

package hjk.java; import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.Collections;import java.

Java】基於TCP協議執行伺服器-客戶端互動控制檯聊天室簡例

      前兩天想到一個手機APP專案,使用到藍芽,發現BluetoothSocket和J2EE網路變成的Socket差不多,使用之餘順手寫一個多執行緒伺服器與客戶端互動實現聊天室的一個小例子,方便新人學習網路程式設計模組,期間使用到多執行緒和IO輸入輸出流的

第35節Java面向物件中的執行

Java面向物件中的多執行緒 多執行緒 在Java面向物件中的多執行緒中,要理解多執行緒的知識點,首先要掌握什麼是程序,什麼是執行緒?為什麼有多執行緒呢?多執行緒存在的意義有什麼什麼呢?執行緒的建立方式又有哪些?以及要理解多執行緒的特點等。

java架構之路(執行)AQS之ReetrantLock顯示鎖的使用和底層原始碼解讀

  說完了我們的synchronized,這次我們來說說我們的顯示鎖ReetrantLock。 上期回顧:   上次部落格我們主要說了鎖的分類,synchronized的使用,和synchronized隱式鎖的膨脹升級過程,從無鎖是如何一步步升級到我們的重量級鎖的,還有我們的逃逸分析。 鎖的粗化和鎖的消除  

java面試/筆試題目之執行及鎖 (持續更新中)

前言:這一模組可以參照徐劉根大佬的部落格。 一.執行緒和程序的概念、並行和併發的概念 1.程序:是計算機中的程式關於某資料集合上的一次執行活動,是系統 進行資源分配和排程的基本單位,是作業系統結構的基礎。程式是指令、資料及其組織形式的描述,程序是程式的實體。 2.執行緒:是程式執行流的

Python學習筆記threading.Condition執行排程

#!/usr/bin/python #coding:utf-8 #引入執行緒和時間模組 import threading,time   #引入執行緒條件變數 cond = threading.Condition() def run():    

java執行物件鎖 鎖 同步機制詳解

分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/ 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

【紮實基本功】Java基礎教程系列之執行

1. 多執行緒的概念 1.1 程序、執行緒、多程序的概念 程序:正在進行中的程式(直譯)。 執行緒是程式執行的一條路徑, 一個程序中可以包含多條執行緒。 一個應用程式可以理解成就是一個程序。 多執行緒併發執行可以提高程式的效率, 可以同時完成多項工作。 1.

java最簡單粗暴講解執行,還不趕緊上車!

這裡並沒有講什麼新東西,只是把多執行緒一些知識來個總結。大家懂得可以複習複習,還有些童鞋對多執行緒朦朧的可以拿這個做為入門~ 舉個栗子說明啥是多執行緒:玩遊戲,前面一堆怪,每個怪都是一個執行緒,你射了一槍,子彈飛出去了,這顆子彈也是一個執行緒。你開啟你的程序管理,看到你遊戲的後臺程序,這就是程序

java 利用Future非同步獲取執行任務結果

Future介面是Java標準API的一部分,在java.util.concurrent包中。Future介面是Java執行緒Future模式的實現,可以來進行非同步計算。 有了Future就可以進行三段式的程式設計了,1.啟動多執行緒任務2.處理其他事3.收集多執行緒任務結果。從而實現了非阻塞

JAVA 8 併發增強(1) 執行修改某個計數器的方式

Q:如何正確的併發修改一個AtomicLong的值? /* 不同執行緒檢測最大值 */ AtomicLong largest = new AtomicLong(); long obsvValue = 0; /* 錯誤的方式,此更新不是原子性的 */ largest.

面試題常見的執行實戰手撕程式碼(順序列印數字、字母)

問題一:   一個多執行緒的問題,用三個執行緒,順序列印字母A-Z,輸出結果是1A 2B 3C 1D 2E…列印完畢最後輸出一個Ok。 程式碼一: public class forCharacter { private static char c = 'A';

java-雙重檢查鎖為什麼執行不安全

如下程式碼所示: public class doubleCheck{ private static Instance instance; public static Instance getInstance(){ if(instance==null){ //1

java高併發學習(九)-----執行的團隊協作:同步控制

Java高併發學習(八)-------多執行緒的團隊協作:同步控制   同步控制是併發程式必不可少的重要手段。之前介紹的synchronized關鍵字就是一種最簡單的控制方法。同時,wait()和notify()方法起到了執行緒等待和通知的作用。這些工具對於實現複雜的多

Java執行的實現(程序與執行的概念、Java繼承Thread實現執行Java實現Runnable介面實現執行、Thread與Runnable的區別、實現Callable介面實現執行

1 程序與執行緒 1.1 程序與執行緒的概念 什麼是程序?   程序: 作業系統中一個程式的執行週期。(比如我們想要在電腦上登入QQ,從雙擊qq按鈕---->關閉qq這個過程就是一個程序)   多程序: 同一時刻跑多個程式。   在DOS(磁碟作業系統時

Java 使用阻塞佇列 BlockingQueue 執行搜尋目錄及子目錄下包含關鍵字所有檔案

Java 使用阻塞佇列 BlockingQueue 多執行緒在一個目錄及它的所以子目錄下搜尋所有檔案,打印出包含關鍵字的行 阻塞佇列( blocking queue ) 生產者執行緒向佇列插人元素, 消費者執行緒則取出它們。使用佇列,可以安全地從一個執行緒向另一個執行緒傳遞資料。

學了Java併發程式設計藝術及執行核心程式設計技術,以及最開始學的程式設計思想那本書,今天做些總結

併發Map分析位碼shift預設值是28,對hash值右移28位,取高四位,獲得segments位置,掩碼mask預設值16-1,作一個與值,不知道有何用處,兩個都是不可修改,初始值和併發度有關,一旦確立下來決定了segments陣列大小,包括segments陣列物件不可修改

Java 單例模式】Java 單例模式在執行環境中可能存在的問題

在多執行緒環境下,使用延遲載入的方式實現單例模式,會出現錯誤。 例如,使用如下方式實現單例類: package study20170307; /** * Created by apple on 17/3/7. */ public class Sin

Java基礎複習一之執行(併發,記憶體模型)

前言:畢業來北京轉眼一年半了,但是沒有太多的成績。沒有太多的記錄和沉澱。現在開始複習一下基礎的知識。涉及到的有多執行緒,集合,JVM,NIO,資料庫,作業系統。後面還是想走實時處理那一塊,可能會有那方面的研究。 多執行緒:為啥用?因為想去執行不同的任務,或利用現狀多核的處

java 彈幕 彈球 執行

package 小程式; import java.awt.BorderLayout; public class tantan extends JFrame implements ActionListener{ private JPanel contentPane;