如何用java实现HTTP长连接
发布时间:2025-05-13 22:53:12 发布人:远客网络
一、如何用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问题的成功率。如果以上方法均未能解决问题,建议查看安装日志文件或寻求专业的技术支持进行进一步诊断。