1. 程式人生 > >JAVA長連線demo(含心跳檢測)

JAVA長連線demo(含心跳檢測)

  1. package houlei.csdn.keepalive;  
  2. import java.io.Serializable;  
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. /** 
  6.  * 維持連線的訊息物件。 
  7.  * <p> 
  8.  * 建立時間:2010-7-18 上午12:22:09 
  9.  * @author HouLei 
  10.  * @since 1.0 
  11.  */
  12. publicclass KeepAlive implements Serializable{  
  13.     privatestatic
    finallong serialVersionUID = -2813120366138988480L;  
  14.     /* 覆蓋該方法,僅用於測試使用。 
  15.      * @see java.lang.Object#toString() 
  16.      */
  17.     @Override
  18.     public String toString() {  
  19.         returnnew SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"\t維持連線包";  
  20.     }  
  21. }  

  1. package houlei.csdn.keepalive;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.io.ObjectInputStream;  
  5. import java.io.ObjectOutputStream;  
  6. import java.net.Socket;  
  7. import java.net.UnknownHostException;  
  8. import java.util.concurrent.ConcurrentHashMap;  
  9. /** 
  10.  *  C/S架構的客戶端物件,持有該物件,可以隨時向服務端傳送訊息。 
  11.  * <p>
     
  12.  * 建立時間:2010-7-18 上午12:17:25 
  13.  * @author HouLei 
  14.  * @since 1.0 
  15.  */
  16. publicclass Client {  
  17.     /** 
  18.      * 處理服務端發回的物件,可實現該介面。 
  19.      */
  20.     publicstaticinterface ObjectAction{  
  21.         void doAction(Object obj,Client client);  
  22.     }  
  23.     publicstaticfinalclass DefaultObjectAction implements ObjectAction{  
  24.         publicvoid doAction(Object obj,Client client) {  
  25.             System.out.println("處理:\t"+obj.toString());  
  26.         }  
  27.     }  
  28.     publicstaticvoid main(String[] args) throws UnknownHostException, IOException {  
  29.         String serverIp = "127.0.0.1";  
  30.         int port = 65432;  
  31.         Client client = new Client(serverIp,port);  
  32.         client.start();  
  33.     }  
  34.     private String serverIp;  
  35.     privateint port;  
  36.     private Socket socket;  
  37.     privateboolean running=false;  
  38.     privatelong lastSendTime;  
  39.     private ConcurrentHashMap<Class, ObjectAction> actionMapping = new ConcurrentHashMap<Class,ObjectAction>();  
  40.     public Client(String serverIp, int port) {  
  41.         this.serverIp=serverIp;this.port=port;  
  42.     }  
  43.     publicvoid start() throws UnknownHostException, IOException {  
  44.         if(running)return;  
  45.         socket = new Socket(serverIp,port);  
  46.         System.out.println("本地埠:"+socket.getLocalPort());  
  47.         lastSendTime=System.currentTimeMillis();  
  48.         running=true;  
  49.         new Thread(new KeepAliveWatchDog()).start();  
  50.         new Thread(new ReceiveWatchDog()).start();  
  51.     }  
  52.     publicvoid stop(){  
  53.         if(running)running=false;  
  54.     }  
  55.     /** 
  56.      * 新增接收物件的處理物件。 
  57.      * @param cls 待處理的物件,其所屬的類。 
  58.      * @param action 處理過程物件。 
  59.      */
  60.     publicvoid addActionMap(Class<Object> cls,ObjectAction action){  
  61.         actionMapping.put(cls, action);  
  62.     }  
  63.     publicvoid sendObject(Object obj) throws IOException {  
  64.         ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());  
  65.         oos.writeObject(obj);  
  66.         System.out.println("傳送:\t"+obj);  
  67.         oos.flush();  
  68.     }  
  69.     class KeepAliveWatchDog implements Runnable{  
  70.         long checkDelay = 10;  
  71.         long keepAliveDelay = 2000;  
  72.         publicvoid run() {  
  73.             while(running){  
  74.                 if(System.currentTimeMillis()-lastSendTime>keepAliveDelay){  
  75.                     try {  
  76.                         Client.this.sendObject(new KeepAlive());  
  77.                     } catch (IOException e) {  
  78.                         e.printStackTrace();  
  79.                         Client.this.stop();  
  80.                     }  
  81.                     lastSendTime = System.currentTimeMillis();  
  82. 相關推薦

    JAVA連線demo心跳檢測

    package houlei.csdn.keepalive;   import java.io.Serializable;   import java.text.SimpleDateFormat;   import java.util.Date;  

    Android通過WebSocket建立一個連線心跳檢測從伺服器端接收訊息

       最近公司要做一款內部使用的工具類app,方便銷售部門打電話(其實就是在後臺有好多使用者資料,之前銷售部門同事撥打電話,需要自己從銷售後臺檢視使用者手機號等資訊,然後自己拿自己手機撥號,然後打出去。現在想實現銷售的同事,點選銷售後臺的按鈕,自己的手機直接撥號的功能)。為此

    自制Mysql資料庫連線工具使用說明

    我們在對mysql資料庫進行操作時,就要使用JDBC去連線資料庫,所以程式碼不免要出現大量的冗餘,比如連線,關閉等等實現其實都是一樣的,所以聰明的程式設計師就會將這些重複的功能封裝,簡化使用過程,提高程式碼複用性。 1.BaseDao原始碼 package com.x

    開發環境-Windows下搭建JAVA Web開發環境Tomcat+MySQL-過程記錄

    一、新建雲伺服器 (請注意,文中連結均在“http”中“h”後和“www”第一個“w”後多加一“ ”)     1、在"teng xun 雲",新建雲伺服器:Windows Server 2012 R2 標準版 64位中文版     2、登入雲伺服器:h ttps://w

    工作總結之----java程式碼連線資料庫SqlServer和oracle

    程式碼:import java.sql.*; public class JDBCUtil { private static final String DBDRIVERSQLSWRVER = "c

    轉: 【Java並發編程】之五:volatile變量修飾符—意料之外的問題代碼

    功能 模式 aik 執行 方法 end bold 有變 目的 轉載請註明出處: volatile用處說明 在JDK1.2之前,Java的內存模型實現總是從主存(即共享內存)讀取變量,是不需要進行特別的註意的。而隨著JVM的成熟和優化,現在在多線程環境下vo

    Java並發編程】之六:Runnable和Thread實現多線程的區別代碼

    技術分享 runnable 避免 實際應用 details div 一個 預測 enter 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17161237 Java中實現多線程有兩種方法:繼承Thre

    轉: 【Java並發編程】之二十:並發新特性—Lock鎖和條件變量代碼

    ets exc n) 否則 max 長時間 info trace space 簡單使用Lock鎖 Java 5中引入了新的鎖機制——Java.util.concurrent.locks中的顯式的互斥鎖:Lock接口,它提供了比synchronized更加廣泛的鎖

    轉: 【Java並發編程】之十八:第五篇中volatile意外問題的正確分析解答代碼

    深入 規則 rup lis con method 執行 change .text 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17382679 在《Java並發編程學習筆記之五:volatile變量修

    轉:【Java並發編程】之十六:深入Java內存模型——happen-before規則及其對DCL的分析代碼

    無需 bit 對象引用 說了 final 緩存 機器 通過 round 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17348313 happen—before規則介紹 Java語言中有一個“先行發生

    轉:【Java並發編程】之十二:線程間通信中notifyAll造成的早期通知問題代碼

    data light lan 添加項 article util tool 元素 seconds 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17229601 如果線程在等待時接到通知,但線程等待的條件

    轉:【Java並發編程】之十九:並發新特性—Executor框架與線程池代碼

    接口類 容易 20px 了解 大小 執行c 生命周期 schedule p s Executor框架簡介 在Java 5之後,並發編程引入了一堆新的啟動、調度和管理線程的API。Executor框架便是Java 5中引入的,其內部使用了線程池機制,它在java.

    轉:【Java並發編程】之十一:線程間通信中notify通知的遺漏代碼

    key wait title net fill article 返回 0ms 註意 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17228213 notify通知的遺漏很容易理解,即threadA還沒

    轉:【Java並發編程】之八:多線程環境中安全使用集合API代碼

    控制 and clas ron com lan 創建 pri 基本上 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17200509 在集合API中,最初設計的Vector和Hashtable是多線程安

    轉: 【Java並發編程】之二十一:並發新特性—阻塞隊列和阻塞棧代碼

    err 退出 link rac gb2312 com void throws pbo 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17511147 阻塞隊列 阻塞隊列是Java 5並發新特性中的內容

    轉: 【Java並發編程】之十三:生產者—消費者模型代碼

    tool boolean 通知 阻塞 上一個 [] ble 否則 線程 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17249321 生產者消費者問題是線程模型中的經典問題:生產者和消費者在同一時間段

    Java反射機制demo—獲得並調用一個類中的方法

    color 擁有 oca logs over super getmethod equals() bool 這個demo在使用反射機制操作屬性之前,主要原因是因為在.class文件字節碼中,方法排在屬性的前面。 1,獲得一個類中的方法 先看一下方法和運行結果。獲取所有的方

    Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死鎖問題代碼

    ray inpu 網絡 數據 code public 文件讀取 情況 從服務器 書上示例 在第一章《基本套接字》中,作者給出了一個TCP Socket通信的例子——反饋服務器,即服務器端直接把從客戶端接收到的數據原原本本地反饋回去。

    Java TCP/IP Socket】TCP Socket代碼

    webkit -c round app code stat -m ride adl TCP的Java支持 協議相當於相互通信的程序間達成的一種約定,它規定了分組報文的結構、交換方式、包含的意義以及怎樣對報文所包含的信息進行解析,TCP/IP協議族有IP協議、TC

    Java TCP/IP Socket】基於線程池的TCP服務器代碼

    init 成對 之前 .get font ack 字符串 fonts exceptio 了解線程池 在http://blog.csdn.net/ns_code/article/details/14105457(讀書筆記一:TCP Socket)這篇博文中,服務器