JAVA長連線demo(含心跳檢測)
- package houlei.csdn.keepalive;
- import java.io.Serializable;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- /**
- * 維持連線的訊息物件。
- * <p>
- * 建立時間:2010-7-18 上午12:22:09
- * @author HouLei
- * @since 1.0
- */
- publicclass KeepAlive implements Serializable{
-
privatestatic
- /* 覆蓋該方法,僅用於測試使用。
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- returnnew SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"\t維持連線包";
- }
- }
-
package houlei.csdn.keepalive;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.net.Socket;
- import java.net.UnknownHostException;
- import java.util.concurrent.ConcurrentHashMap;
- /**
- * C/S架構的客戶端物件,持有該物件,可以隨時向服務端傳送訊息。
-
* <p>
- * 建立時間:2010-7-18 上午12:17:25
- * @author HouLei
- * @since 1.0
- */
- publicclass Client {
- /**
- * 處理服務端發回的物件,可實現該介面。
- */
- publicstaticinterface ObjectAction{
- void doAction(Object obj,Client client);
- }
- publicstaticfinalclass DefaultObjectAction implements ObjectAction{
- publicvoid doAction(Object obj,Client client) {
- System.out.println("處理:\t"+obj.toString());
- }
- }
- publicstaticvoid main(String[] args) throws UnknownHostException, IOException {
- String serverIp = "127.0.0.1";
- int port = 65432;
- Client client = new Client(serverIp,port);
- client.start();
- }
- private String serverIp;
- privateint port;
- private Socket socket;
- privateboolean running=false;
- privatelong lastSendTime;
- private ConcurrentHashMap<Class, ObjectAction> actionMapping = new ConcurrentHashMap<Class,ObjectAction>();
- public Client(String serverIp, int port) {
- this.serverIp=serverIp;this.port=port;
- }
- publicvoid start() throws UnknownHostException, IOException {
- if(running)return;
- socket = new Socket(serverIp,port);
- System.out.println("本地埠:"+socket.getLocalPort());
- lastSendTime=System.currentTimeMillis();
- running=true;
- new Thread(new KeepAliveWatchDog()).start();
- new Thread(new ReceiveWatchDog()).start();
- }
- publicvoid stop(){
- if(running)running=false;
- }
- /**
- * 新增接收物件的處理物件。
- * @param cls 待處理的物件,其所屬的類。
- * @param action 處理過程物件。
- */
- publicvoid addActionMap(Class<Object> cls,ObjectAction action){
- actionMapping.put(cls, action);
- }
- publicvoid sendObject(Object obj) throws IOException {
- ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
- oos.writeObject(obj);
- System.out.println("傳送:\t"+obj);
- oos.flush();
- }
- class KeepAliveWatchDog implements Runnable{
- long checkDelay = 10;
- long keepAliveDelay = 2000;
- publicvoid run() {
- while(running){
- if(System.currentTimeMillis()-lastSendTime>keepAliveDelay){
- try {
- Client.this.sendObject(new KeepAlive());
- } catch (IOException e) {
- e.printStackTrace();
- Client.this.stop();
- }
- lastSendTime = System.currentTimeMillis();
-
相關推薦
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)這篇博文中,服務器