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());

}

}

}

java socket长连接怎么维持_socket长连接的维持相关推荐

  1. Java Socket 客户端使用指定端口多次连接服务器引发 BindException

    有这样一个需求,客户端要用特定端口连接服务器,可以用bind方法绑定一个本地的InetAddress,第一次连接是ok的,但是第二次连接就会报 BindException 异常(Bind: Addre ...

  2. java socket发送16进制_JavaSocket短连接实现分别接收字符串和16进制数据

    做个笔记,在接收16进制数据的时候乱码了.原因是Socket在接收数据的时候需要根据不同的数据定义不同的接收方式,也就是约定好传输协议(具体体现在后面服务端接收16进制那里). 字符串的发送接收 字符 ...

  3. java socket 如何设置so_keepalive属性_socket通信的KeepAlive设定

    socket通信的KeepAlive默认时间是2小时,通过以下代码可以改变其时间,来检测socket通信过程中自网线,服务器网线断等事件 #include #include "winsock ...

  4. java socket 心跳包_socket中的短连接与长连接,心跳包示例详解

    TCP连接简介 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接, 当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接, 连接的建立是需要三 ...

  5. java socket 短连接_socket长连接和短连接的区别

    长连接与短连接的区别(tcp socket http概念原理是一样的) 一.长连接与短连接:长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收.这种方式下由于 ...

  6. java android长连接_基于Java Socket的自定义协议,实现Android与服务器的长连接(一)...

    一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解 ...

  7. java前端长连接框架_Java中Spring Boot+Socket实现与html页面的长连接实例详解

    Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码 功能介绍 客户端给所有在线用户发送消息客户端给指定在线用户发送消息服务器 ...

  8. java长连接心跳包_socket中的短连接与长连接,心跳包示例详解

    TCP连接简介 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接, 当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接, 连接的建立是需要三 ...

  9. java socket发送定长报文_一个基于TCP协议的Socket通信实例

    原标题:一个基于TCP协议的Socket通信实例 1. 前言 一般接口对接多以http/https或webservice的方式,socket方式的对接比较少并且会有一些难度.正好前段时间完成了一个so ...

最新文章

  1. 渗透攻击(NT/2000系统)
  2. 内置方法-str方法定制变量输出信息
  3. 中文版putty后门事件的曝光过程及我们所受到的报复
  4. idea 代码编译打包不报错,但是代码显示报错
  5. .net Remoting(1)——起点,从示例做起
  6. c#中跨线程调用windows窗体控件
  7. 网络克隆安装linux系统下载安装,pxe网刻工具_诚龙网刻教程_网络克隆安装windows7...
  8. Ovi商店开发者注册发布指南
  9. 2022.7-8文献笔记
  10. 新计算机的word无法输入文字,Win10专业版系统为什么不能给电脑Word输入中文汉字...
  11. 郑州大学计算机翟雨轩,郑州大学文件-20210331220732.doc-原创力文档
  12. 笔记本电脑ip服务器未运行怎么办,如何解决控制台打开(Pubwin)提示“服务器未启动或服务器IP地址已更改”的问题...
  13. 计算机故障四类,计算机内存出现问题的四大症状
  14. python爬虫爬取安居客并进行简单数据分析
  15. LDA深入精讲(强力推荐)
  16. 桌面快捷方式左下角有小黑块怎么解决?两秒搞定!
  17. 学做网站有哪些注意事项(上)
  18. [Vim 编译出错]syntax error: unexpected end of file
  19. 北京赞同科技发展有限公司产品开发部招聘高级软件工程师及产品经理
  20. Large-Scale Long-Tailed Recognition in an Open World

热门文章

  1. Office在线预览及PDF在线预览的实现方式大集合
  2. ORACLE HANDBOOK系列之十:字符集、编码以及Oracle的那些事
  3. 解读30个提高Web程序执行效率的好经验
  4. python pickle模块的使用/将python数据对象序列化保存到文件中
  5. PHP linux spl_autoload_register区分大小写
  6. Document、HTMLDocument关系的探究
  7. System.BadImageFormatException: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)...
  8. Eclipse窗口显示:独立、嵌入式
  9. 02-07 Python库-pytest
  10. arduino液位传感器_如何使用Arduino + VL53L0X来制作液位感应设备