「java保持连接」java socket保持连接

博主:adminadmin 2023-03-17 23:26:08 589

本篇文章给大家谈谈java保持连接,以及java socket保持连接对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

怎么判断java是否是长连接

长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 长链接的操作过程是连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接; 这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,短连接在没有数据传输时直接关闭就行了.

java如何实现http长连接

通过轮询来实现长连接

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

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架构的客户端对象,持有该对象,可以随时向服务端发送消息。

* p

* 创建时间: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 ConcurrentHashMapClass, ObjectAction actionMapping = new ConcurrentHashMapClass,ObjectAction();

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(ClassObject 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()-lastSendTimekeepAliveDelay){

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架构的服务端对象。

* p

* 创建时间: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 ConcurrentHashMapClass, ObjectAction actionMapping = new ConcurrentHashMapClass,ObjectAction();

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(ClassObject 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()-lastReceiveTimereceiveTimeDelay){

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 web即时聊天如何保持长连接

Web长连接可以使用跨浏览器兼容套接字解决方案,服务器需要事件驱动和异步I/O机制的语言脚本较容易实现且性能可观。望楼主尝试搭建Nodejs + Socket.IO 来解决web端持久化连接的问题。 共享消息可以使用Socket.IO的broadcast广播机制或者命名空间接口下的所有sockets进行send

求java nio网络编程的小例子,要求客户端一直与服务器保持连接

import java.awt.*;

import java.awt.event.*;

import java.io.IOException;

import java.net.*;

import java.io.*;

public class chatClient extends Frame {

/**

* @param args

*/

TextField tfTxT=new TextField();

TextArea taContent=new TextArea();

Socket s=null;

DataOutputStream dos=null;

DataInputStream dis=null;

private boolean bConnected =false;

public static void main(String[] args) {

new chatClient().lunachFrame();

}

private class RecvThread implements Runnable{

public void run() {

try{

while(bConnected){

String str=dis.readUTF();

taContent.setText(taContent.getText()+str+'\n');

}

}catch(IOException e){

e.printStackTrace();

}

}

}

public void lunachFrame(){

this.setLocation(400, 300);

this.setSize(300,300);

//this.setLayout(new FlowLayout());

this.add(tfTxT,"South");

this.add(taContent,"North");

pack();

tfTxT.addActionListener(new TFListener());

this.addWindowListener(new WindowClose());

this.setVisible(true);

connect();

new Thread(new RecvThread()).start();

}

public void connect(){

try {

s= new Socket("127.0.0.1",8888);

dos =new DataOutputStream(s.getOutputStream());

dis =new DataInputStream(s.getInputStream());

System.out.println("connected!");

bConnected=true;

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

public void disconnect(){

try {

dos.close();

s.close();

} catch (Exception e) {

// TODO 自动生成 catch 块

e.printStackTrace();

}

}

class WindowClose extends WindowAdapter{

@Override

public void windowClosing(WindowEvent e) {

// TODO 自动生成方法存根

System.exit(0);

disconnect();

}

}

private class TFListener implements ActionListener{

public void actionPerformed(ActionEvent e) {

String str=tfTxT.getText().trim();//trim去掉两边空格

//taContent.setText(str);

tfTxT.setText("");

try {

dos.writeUTF(str);

dos.flush();

//dos.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

}

}

======================================

import java.io.IOException;

import java.net.*;

import java.io.*;

import java.util.*;

public class ChatServer {

ListClient clients=new ArrayListClient();

Client c=null;

public static void main(String[] args){

new ChatServer().start();

}

public void start(){

boolean started=false;

ServerSocket ss=null;

DataInputStream dis=null;

try{

ss=new ServerSocket(8888);

started =true;

}catch(Exception e)

{

e.printStackTrace();

}

try{

while(started){

Socket s=ss.accept();

c=new Client(s);//启动线程,实行run()方法

System.out.println("a client connected!");

new Thread(c).start();//启动start方法,循环.start是Thread中的方法与这上面的start无关

clients.add(c);

//dis.close();

}

} catch (Exception e) {

//e.printStackTrace();

}

finally{

try {

ss.close();

} catch (IOException e) {

// TODO 自动生成 catch 块

e.printStackTrace();

}

}

}

class Client implements Runnable{

private Socket s;

private DataInputStream dis =null;

private boolean bConnected =false;

private DataOutputStream dos=null;

public Client(Socket s){

this.s=s;

try {

dis=new DataInputStream(s.getInputStream());

dos =new DataOutputStream(s.getOutputStream());

bConnected =true;

} catch (IOException e) {

// TODO 自动生成 catch 块

e.printStackTrace();

}

}

public void send(String str)throws Exception{

dos.writeUTF(str);

}

public void run() {

try{

while(bConnected){

String str = dis.readUTF();

System.out.println(str);

for(int i=0;iclients.size();i++){

c=clients.get(i);

c.send(str);

}

/*for(IteratorClient it=clients.iterator();it.hasNext();){

Client c=it.next();

c.send(str);

}*/

}

}catch(SocketException e){

clients.remove(this);

System.out.println("客户下线了");

}

catch(EOFException e){

System.out.println("Client closed");

}

catch (Exception e){

//e.printStackTrace();

}

finally{

try {

if(dis !=null) dis.close();

if(dos !=null) dos.close();

if(s!=null) s.close();

} catch (Exception e1) {

// TODO 自动生成 catch 块

//e1.printStackTrace();

}

}

}

}

}

第一个是客户端,

第二个是server端

java保持连接的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java socket保持连接、java保持连接的信息别忘了在本站进行查找喔。