Java socket,java socket長連接怎么維持_socket長連接的維持

 2023-10-06 阅读 23 评论 0

摘要:import java.io.Serializable;import java.text.SimpleDateFormat;import java.util.Date;/*** 維持連接的消息對象。* * 創建時間:2010-7-18 上午12:22:09* @author HouLei* @since 1.0*/public classKeepAlive implements Serializable{private static final

import java.io.Serializable;

import java.text.SimpleDateFormat;

import java.util.Date;/**

* 維持連接的消息對象。

*

* 創建時間:2010-7-18 上午12:22:09

* @author HouLei

* @since 1.0*/

public classKeepAlive implements Serializable{private static final long serialVersionUID = -2813120366138988480L;/*覆蓋該方法,僅用于測試使用。

* @see java.lang.Object#toString()*/@OverridepublicString toString() {return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"\t維持連接包";

}

}

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架構的客戶端對象,持有該對象,可以隨時向服務端發送消息。

*

* 創建時間:2010-7-18 上午12:17:25

* @author HouLei

* @since 1.0*/

public classClient {/**

* 處理服務端發回的對象,可實現該接口。*/

public static interfaceObjectAction{voiddoAction(Object obj,Client client);

}public static final classDefaultObjectAction implements ObjectAction{public voiddoAction(Object obj,Client client) {

System.out.println("處理:\t"+obj.toString());

}

}public static voidmain(String[] args) throws UnknownHostException, IOException {

String serverIp= "127.0.0.1";int port = 65432;

Client client= newClient(serverIp,port);

client.start();

}privateString serverIp;private intport;privateSocket socket;private boolean running=false;private longlastSendTime;private ConcurrentHashMap actionMapping = new ConcurrentHashMap();public Client(String serverIp, intport) {this.serverIp=serverIp;this.port=port;

}public voidstart() throws UnknownHostException, IOException {if(running)return;

socket= newSocket(serverIp,port);

System.out.println("本地端口:"+socket.getLocalPort());

lastSendTime=System.currentTimeMillis();

running=true;new Thread(newKeepAliveWatchDog()).start();new Thread(newReceiveWatchDog()).start();

}public voidstop(){if(running)running=false;

}/**

* 添加接收對象的處理對象。

* @param cls 待處理的對象,其所屬的類。

* @param action 處理過程對象。*/

public void addActionMap(Classcls,ObjectAction action){

actionMapping.put(cls, action);

}public voidsendObject(Object obj) throws IOException {

ObjectOutputStream oos= newObjectOutputStream(socket.getOutputStream());

oos.writeObject(obj);

System.out.println("發送:\t"+obj);

oos.flush();

}classKeepAliveWatchDog implements Runnable{long checkDelay = 10;long keepAliveDelay = 2000;public voidrun() {while(running){if(System.currentTimeMillis()-lastSendTime>keepAliveDelay){try{

Client.this.sendObject(newKeepAlive());

}catch(IOException e) {

e.printStackTrace();

Client.this.stop();

}

lastSendTime=System.currentTimeMillis();

}else{try{

Thread.sleep(checkDelay);

}catch(InterruptedException e) {

e.printStackTrace();

Client.this.stop();

}

}

}

}

}classReceiveWatchDog implements Runnable{public voidrun() {while(running){try{

InputStreamin =socket.getInputStream();if(in.available()>0){

ObjectInputStream ois= new ObjectInputStream(in);

Object obj=ois.readObject();

System.out.println("接收:\t"+obj);

ObjectAction oa= actionMapping.get(obj.getClass());

oa= oa==null?newDefaultObjectAction():oa;

oa.doAction(obj, Client.this);

}else{

Thread.sleep(10);

}

}catch(Exception e) {

e.printStackTrace();

Client.this.stop();

}

}

}

}

}

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.concurrent.ConcurrentHashMap;/**

* C/S架構的服務端對象。

*

* 創建時間:2010-7-18 上午12:17:37

* @author HouLei

* @since 1.0*/

public classServer {/**

* 要處理客戶端發來的對象,并返回一個對象,可實現該接口。*/

public interfaceObjectAction{

Object doAction(Object rev);

}public static final classDefaultObjectAction implements ObjectAction{publicObject doAction(Object rev) {

System.out.println("處理并返回:"+rev);returnrev;

}

}public static voidmain(String[] args) {int port = 65432;

Server server= newServer(port);

server.start();

}private intport;private volatile boolean running=false;private long receiveTimeDelay=3000;private ConcurrentHashMap actionMapping = new ConcurrentHashMap();privateThread connWatchDog;public Server(intport) {this.port =port;

}public voidstart(){if(running)return;

running=true;

connWatchDog= new Thread(newConnWatchDog());

connWatchDog.start();

}

@SuppressWarnings("deprecation")public voidstop(){if(running)running=false;if(connWatchDog!=null)connWatchDog.stop();

}public void addActionMap(Classcls,ObjectAction action){

actionMapping.put(cls, action);

}classConnWatchDog implements Runnable{public voidrun(){try{

ServerSocket ss= new ServerSocket(port,5);while(running){

Socket s=ss.accept();new Thread(newSocketAction(s)).start();

}

}catch(IOException e) {

e.printStackTrace();

Server.this.stop();

}

}

}classSocketAction implements Runnable{

Socket s;

boolean run=true;long lastReceiveTime =System.currentTimeMillis();publicSocketAction(Socket s) {this.s =s;

}public voidrun() {while(running &&run){if(System.currentTimeMillis()-lastReceiveTime>receiveTimeDelay){

overThis();

}else{try{

InputStreamin =s.getInputStream();if(in.available()>0){

ObjectInputStream ois= new ObjectInputStream(in);

Object obj=ois.readObject();

lastReceiveTime=System.currentTimeMillis();

System.out.println("接收:\t"+obj);

ObjectAction oa= actionMapping.get(obj.getClass());

oa= oa==null?newDefaultObjectAction():oa;

Objectout =oa.doAction(obj);if(out!=null){

ObjectOutputStream oos= newObjectOutputStream(s.getOutputStream());

oos.writeObject(out);

oos.flush();

}

}else{

Thread.sleep(10);

}

}catch(Exception e) {

e.printStackTrace();

overThis();

}

}

}

}private voidoverThis() {if(run)run=false;if(s!=null){try{

s.close();

}catch(IOException e) {

e.printStackTrace();

}

}

System.out.println("關閉:"+s.getRemoteSocketAddress());

}

}

}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/122598.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息