JAVA 긴 연결(심장 박동 감지 포함) 데모
긴 연결 유지는 클라이언트 프로그램이 정해진 시간에 서버 프로그램에 연결 유지 패키지를 보내는 것이다.만약 오랫동안 연결 유지 패키지를 보내지 않으면 서버 프로그램이 연결을 끊을 것입니다.클라이언트: 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
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.