您当前的位置:首页 > 互联网教程

如何用java实现HTTP长连接

发布时间:2025-05-13 22:53:12    发布人:远客网络

如何用java实现HTTP长连接

一、如何用java实现HTTP长连接

轮询:隔一段时间访问服务器,服务器不管有没有新消息都立刻返回。

package houlei.csdn.keepalive;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.UnknownHostException;

import java.util.concurrent.ConcurrentHashMap;

* C/S架构的客户端对象,持有该对象,可以随时向服务端发送消息。

*创建时间:2010-7-18上午12:17:25

*处理服务端发回的对象,可实现该接口。

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{

Client client= new Client(serverIp,port);

private boolean running=false;

private ConcurrentHashMap<Class, ObjectAction> actionMapping= new ConcurrentHashMap<Class,ObjectAction>();

public Client(String serverIp, int port){

this.serverIp=serverIp;this.port=port;

public void start() throws UnknownHostException, IOException{

socket= new Socket(serverIp,port);

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

lastSendTime=System.currentTimeMillis();

new Thread(new KeepAliveWatchDog()).start();

new Thread(new ReceiveWatchDog()).start();

*@param cls待处理的对象,其所属的类。

public void addActionMap(Class<Object> cls,ObjectAction action){

actionMapping.put(cls, action);

public void sendObject(Object obj) throws IOException{

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

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

class KeepAliveWatchDog implements Runnable{

if(System.currentTimeMillis()-lastSendTime>keepAliveDelay){

Client.this.sendObject(new KeepAlive());

lastSendTime= System.currentTimeMillis();

} catch(InterruptedException e){

class ReceiveWatchDog implements Runnable{

InputStream in= socket.getInputStream();

ObjectInputStream ois= new ObjectInputStream(in);

System.out.println("接收:\t"+obj);//接受数据

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

oa= oa==null?new DefaultObjectAction():oa;

oa.doAction(obj, Client.this);

package houlei.csdn.keepalive;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.util.concurrent.ConcurrentHashMap;

*创建时间:2010-7-18上午12:17:37

*要处理客户端发来的对象,并返回一个对象,可实现该接口。

public interface ObjectAction{

public static final class DefaultObjectAction implements ObjectAction{

public Object doAction(Object rev){

System.out.println("处理并返回:"+rev);//确认长连接状况

public static void main(String[] args){

Server server= new Server(port);

private volatile boolean running=false;

private long receiveTimeDelay=3000;

private ConcurrentHashMap<Class, ObjectAction> actionMapping= new ConcurrentHashMap<Class,ObjectAction>();

connWatchDog= new Thread(new ConnWatchDog());

@SuppressWarnings("deprecation")

if(connWatchDog!=null)connWatchDog.stop();

public void addActionMap(Class<Object> cls,ObjectAction action){

actionMapping.put(cls, action);

class ConnWatchDog implements Runnable{

ServerSocket ss= new ServerSocket(port,5);

new Thread(new SocketAction(s)).start();

class SocketAction implements Runnable{

long lastReceiveTime= System.currentTimeMillis();

public SocketAction(Socket s){

if(System.currentTimeMillis()-lastReceiveTime>receiveTimeDelay){

InputStream in= s.getInputStream();

ObjectInputStream ois= new ObjectInputStream(in);

lastReceiveTime= System.currentTimeMillis();

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

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

oa= oa==null?new DefaultObjectAction():oa;

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

System.out.println("关闭:"+s.getRemoteSocketAddress());//关闭长连接

长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的。

如果,长时间未发送维持连接包,服务端程序将断开连接。

二、如何实现java http长连接推送数据

轮询:隔一段时间访问服务器,服务器不管有没有新消息都立刻返回。

package houlei.csdn.keepalive;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.UnknownHostException;

import java.util.concurrent.ConcurrentHashMap;

* C/S架构的客户端对象,持有该对象,可以随时向服务端发送消息。

*创建时间:2010-7-18上午12:17:25

*处理服务端发回的对象,可实现该接口。

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{

Client client= new Client(serverIp,port);

private boolean running=false;

private ConcurrentHashMap<Class, ObjectAction> actionMapping= new ConcurrentHashMap<Class,ObjectAction>();

public Client(String serverIp, int port){

this.serverIp=serverIp;this.port=port;

public void start() throws UnknownHostException, IOException{

socket= new Socket(serverIp,port);

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

lastSendTime=System.currentTimeMillis();

new Thread(new KeepAliveWatchDog()).start();

new Thread(new ReceiveWatchDog()).start();

*@param cls待处理的对象,其所属的类。

public void addActionMap(Class<Object> cls,ObjectAction action){

actionMapping.put(cls, action);

public void sendObject(Object obj) throws IOException{

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

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

class KeepAliveWatchDog implements Runnable{

if(System.currentTimeMillis()-lastSendTime>keepAliveDelay){

Client.this.sendObject(new KeepAlive());

lastSendTime= System.currentTimeMillis();

三、安装java提示安装未完成错误码1603

1、遇到安装Java提示错误码1603,首先明确此错误通常与安装过程中的路径识别问题相关。若出现此提示,不妨从以下几个方面排查:

2、1:检查安装路径是否安全。避免使用包含特殊字符的用户名作为安装目录,特殊字符可能会导致路径识别错误。确保路径简洁,避免使用中文或其他非英文字符。

3、2:留意路径中是否包含标点符号。在文件路径中使用标点符号同样可能导致错误。建议使用纯字母数字字符来构建路径。

4、3:回顾之前的安装或卸载操作。如果近期有进行过Java的安装或卸载,确保操作完全执行完毕。未完全的卸载或安装可能会留下残留,影响后续安装。

5、4:考虑执行清理操作。在重新安装Java之前,使用系统自带的清理工具或专门的卸载软件彻底清除Java相关文件,避免残留文件造成安装冲突。

6、5:检查系统权限。确保安装Java的账户具有足够的权限。在某些情况下,权限不足也可能导致安装失败。尝试以管理员权限执行安装程序。

7、6:验证系统兼容性。确认你的操作系统版本与Java版本之间是否兼容。不兼容的组合可能导致安装失败。访问Java官方网站,查阅兼容性列表,确保操作正确。

8、按照上述步骤逐一排查问题,可以提高解决安装Java提示错误码1603问题的成功率。如果以上方法均未能解决问题,建议查看安装日志文件或寻求专业的技术支持进行进一步诊断。