当年话下

通过轮询来实现长连接轮询:隔一段时间访问服务器,服务器不管有没有新消息都立刻返回。http长连接实现代码:客户端: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架构的客户端对象,持有该对象,可以随时向服务端发送消息。*

* 创建时间:2010-7-18 上午12:17:25* @author HouLei* @since 1.0*/public class Client {/*** 处理服务端发回的对象,可实现该接口。*/public static interface ObjectAction{void doAction(Object obj,Client client);}public static final class DefaultObjectAction implements ObjectAction{public void doAction(Object obj,Client client) {System.out.println("处理:\t"+obj.toString());//诊断程序是否正常}}public static void 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;private int port;private Socket socket;private boolean running=false;private long lastSendTime;private ConcurrentHashMap actionMapping = new ConcurrentHashMap();public Client(String serverIp, int port) {this.serverIp=serverIp;this.port=port;}public void 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();}public void stop(){if(running)running=false;}/*** 添加接收对象的处理对象。* @param cls 待处理的对象,其所属的类。* @param action 处理过程对象。*/public void addActionMap(Class cls,ObjectAction action){actionMapping.put(cls, action);}public void 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;public void 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();}else{try {Thread.sleep(checkDelay);} catch (InterruptedException e) {e.printStackTrace();Client.this.stop();}}}}}class ReceiveWatchDog implements Runnable{public void run() {while(running){try {InputStream in = 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?new DefaultObjectAction():oa;oa.doAction(obj, Client.this);}else{Thread.sleep(10);}} catch (Exception e) {e.printStackTrace();Client.this.stop();}}}}}服务端:package houlei.csdn.keepalive;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 class Server {/*** 要处理客户端发来的对象,并返回一个对象,可实现该接口。*/public interface ObjectAction{Object doAction(Object rev);}public static final class DefaultObjectAction implements ObjectAction{public Object doAction(Object rev) {System.out.println("处理并返回:"+rev);//确认长连接状况return rev;}}public static void main(String[] args) {int port = 65432;Server server = new Server(port);server.start();}private int port;private volatile boolean running=false;private long receiveTimeDelay=3000;private ConcurrentHashMap actionMapping = new ConcurrentHashMap();private Thread connWatchDog;public Server(int port) {this.port = port;}public void start(){if(running)return;running=true;connWatchDog = new Thread(new ConnWatchDog());connWatchDog.start();}@SuppressWarnings("deprecation")public void stop(){if(running)running=false;if(connWatchDog!=null)connWatchDog.stop();}public void addActionMap(Class cls,ObjectAction action){actionMapping.put(cls, action);}class ConnWatchDog implements Runnable{public void run(){try {ServerSocket ss = new ServerSocket(port,5);while(running){Socket s = ss.accept();new Thread(new SocketAction(s)).start();}} catch (IOException e) {e.printStackTrace();Server.this.stop();}}}class SocketAction implements Runnable{Socket s;boolean run=true;long lastReceiveTime = System.currentTimeMillis();public SocketAction(Socket s) {this.s = s;}public void run() {while(running && run){if(System.currentTimeMillis()-lastReceiveTime>receiveTimeDelay){overThis();}else{try {InputStream in = 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?new DefaultObjectAction():oa;Object out = oa.doAction(obj);if(out!=null){ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());oos.writeObject(out);oos.flush();}}else{Thread.sleep(10);}} catch (Exception e) {e.printStackTrace();overThis();}}}}private void overThis() {if(run)run=false;if(s!=null){try {s.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("关闭:"+s.getRemoteSocketAddress());//关闭长连接}}}长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的。如果,长时间未发送维持连接包,服务端程序将断开连接。

java长连接_java如何实现http长连接相关推荐

  1. java ssl证书_Java安全教程–创建SSL连接和证书的分步指南

    java ssl证书 在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程. 如我们之前的文章中所述, 安全套接字层(SSL)/ ...

  2. java math 类_Java Math类静态长轮(double d)示例

    java math 类 数学课静态长回合(双D) (Math Class static long round(double d) ) This method is available in java. ...

  3. java创建不定长数组_java如何创建不定长的数组?

    java如何创建不定长的数组? JAVA没法定义不定长的数组,要么声明为NULL,要么指定其长度.如果需要不定长的集合,我们可以采用ArrayList来解决. 1.首先声明一个集合listArrayL ...

  4. java sqlserver 异常处理_Java代码SSL https 加密连接 sqlserver

    3种连接sqlserver方式 URL 的区别: 1)jdbc:sqlserver://IP:port;DatabaseName=dbName;autoReconnectForPools=true; ...

  5. java rmi配置_Java、Spring配置RMI连接

    1.新建J2EE项目A.B,在A.B项目中建立com.A.xfire包 2.项目A.B中导入spring-2.5.6.jar 3.在A.B项目中使用建立接口类com.A.xfire.XfireFaca ...

  6. java axis 拒绝连接_java – org.apache.axis2.AxisFault连接被拒绝

    尝试从客户端应用程序中获取服务时,我收到以下错误. 有人能告诉我这个例外的原因吗? 提前致谢 org.apache.axis2.AxisFault:Conexiónrehusada at org.ap ...

  7. java长连接转短连接_java原生程序redis连接(连接池/长连接和短连接)选择问题...

    原标题:java原生程序redis连接(连接池/长连接和短连接)选择问题 最近遇到的连接问题我准备从重构的几个程序(redis和mysql)长连接和短连接,以及连接池和单连接等问题用几篇博客来总结下. ...

  8. java 短连接转长连接_转:关于长连接和短连接

    TCP/IP通信程序设计的丰富多样性 刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程 序,据此一些人可能会认为TCP/IP编程很简单.其实不然, TCP/IP编程具有较为丰富的内容.其编 ...

  9. java 不定参数_java中不定长参数的实例用法

    java中不定长参数的使用方法 不定长参数方法的语法如下: 返回值 方法名(参数类型...参数名称) 在参数列表中使用"..."形式定义不定长参数,其实这个不定长参数a就是一个数组 ...

  10. java 不定长参数_java中什么是不定长参数?

    java中的不定长参数 不定长度参数,就是没有规定长度的参数. 不定长参数方法的语法如下:返回值 方法名(参数类型...参数名称) 在参数列表中使用"..."形式定义不定长参数,其 ...

最新文章

  1. 软件开发面试_如何为成功的软件开发工作面试做准备
  2. 3550配置DHCP
  3. StoreFront web 无法启动指定的应用
  4. 9个不为人知的Python技巧
  5. python tkinter窗口切换_tkinter--实现简单的页面切换
  6. C 的 3种内存顺序,你都知道吗?
  7. IM即时通讯结合mui 环信
  8. 小于等于0_从0开始学ARMARM汇编指令其实很简单
  9. Vue底层判断标签的性能优化方法
  10. rhel linux 自动 fsck,red hat as 4 启动报错:checking filesystems fsck.ext3: bad magic number ......
  11. CSS中文手册下载、使用技巧(附下载链接,压缩包被禁用了)
  12. 谷歌地球网页版_谷歌地球:Google Earth 专业版
  13. 解决 adb no permissions (user mi is not in the plugdev group);
  14. 2022江南大学851计算机初试考研经验分享
  15. cesium城市建筑颜色渲染以及泛光渐变效果
  16. Nginx之web前言
  17. AWTRIX像素屏时钟搭建
  18. 如何将文字转化为语音?方法超级简单,立马就能学会配音
  19. Java语言程序设计基础篇原书第十版第二章编程练习题答案
  20. .NetCore——Autofac使用

热门文章

  1. 基于51单片机+SYN6288语音播报
  2. 视频教程-【深入理解计算机网络】讲师解读计算机网络原理视频课程(中)-计算机网络
  3. 28.STM32电阻与电容触摸屏幕
  4. LBS基站定位接口代码示例
  5. 经典教材《晶体管电路设计》
  6. 视频投屏技术原理分享
  7. C# Winform多语言切换
  8. 车架号校验 php代码,VIN车辆识别代码查询(精准版)
  9. qq在计算机上丢失怎么办,我把电脑界面上的我的电脑 QQ等东西全部弄消失了 怎么才能恢复...
  10. 怎么套dedecms(织梦cms)模板