JAVA 긴 연결(심장 박동 감지 포함) 데모

7893 단어 JavaWebSocket
실현 원리:
긴 연결 유지는 클라이언트 프로그램이 정해진 시간에 서버 프로그램에 연결 유지 패키지를 보내는 것이다.만약 오랫동안 연결 유지 패키지를 보내지 않으면 서버 프로그램이 연결을 끊을 것입니다.클라이언트: Client는 Socket이 있는 객체를 통해 언제든지 서버로 Massage Object(메시지)를 보낼 수 있습니다.만약keepAliveDelay밀리초(프로그램에서 2초) 내에 아무런 데이터도 보내지 않으면,keepAlive Object(심장박동)를 서버에 자동으로 보내서 연결을 유지하는 데 사용합니다.왜냐하면 우리는 서비스 측에 많은 서로 다른 메시지 대상을 보낼 수 있고 서비스 측도 서로 다른 대상을 되돌릴 수 있기 때문이다.따라서 되돌아오는 대상에 대한 처리는 구체적인 ObjectAction 실현 클래스를 작성하여 처리해야 한다.Client.addActionMap 메서드를 추가합니다.이렇게 하면 프로그램이 리셋 처리될 것이다.서비스 측: 클라이언트가 정시(keep Alive Delay 밀리초)에 연결을 유지하는 정보를 보내기 때문에 서비스 측은 검사 메커니즘을 가지고 있어야 한다.즉, 서버 Receive Time Delay 밀리초 (프로그램에서 3초) 내에 데이터를 받지 못하면 클라이언트와의 연결을 자동으로 끊습니다.ActionMapping의 원리는 클라이언트와 비슷합니다(동일).
상응하는 ObjectAction 구현 클래스를 추가함으로써 서로 다른 대상의 응답, 응답 과정을 실현할 수 있다.
Demo:
package socket.keepalive.test;


import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 
 *          (    )
 */
public class KeepAlive implements Serializable{

	private static final long serialVersionUID = -2813120366138988480L;

	/*      ,       。
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"\t     ";
	}

}


 
package socket.keepalive.test;

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.Collections;
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(); // , 2 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 socket.keepalive.test;


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, Server server); } public static final class DefaultObjectAction implements ObjectAction{ public Object doAction(Object rev,Server server) { 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,Server.this); 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()); } } }


 
 
 

좋은 웹페이지 즐겨찾기