小編給大家分享一下JAVA怎么實(shí)現(xiàn)長連接,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司專注于鳳翔網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供鳳翔營銷型網(wǎng)站建設(shè),鳳翔網(wǎng)站制作、鳳翔網(wǎng)頁設(shè)計(jì)、鳳翔網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)服務(wù),打造鳳翔網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鳳翔網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
實(shí)現(xiàn)原理:
長連接的維持,是要客戶端程序,定時(shí)向服務(wù)端程序,發(fā)送一個(gè)維持連接包的。
如果,長時(shí)間未發(fā)送維持連接包,服務(wù)端程序?qū)嚅_連接。
客戶端:
Client通過持有Socket的對象,可以隨時(shí)(使用sendObject方法)發(fā)送Massage Object(消息)給服務(wù)端。
如果keepAliveDelay毫秒(程序中是2秒)內(nèi)未發(fā)送任何數(shù)據(jù),則自動(dòng)發(fā)送一個(gè)KeepAlive Object(心跳)給服務(wù)端,用于維持連接。
由于,我們向服務(wù)端,可以發(fā)送很多不同的消息對象,服務(wù)端也可以返回不同的對象。所以,對于返回對象的處理,要編寫具體的ObjectAction實(shí)現(xiàn)類進(jìn)行處理。通過Client.addActionMap方法進(jìn)行添加。這樣,程序會(huì)回調(diào)處理。
服務(wù)端:
由于客戶端會(huì)定時(shí)(keepAliveDelay毫秒)發(fā)送維持連接的信息過來,所以,服務(wù)端要有一個(gè)檢測機(jī)制。
即當(dāng)服務(wù)端receiveTimeDelay毫秒(程序中是3秒)內(nèi)未接收任何數(shù)據(jù),則自動(dòng)斷開與客戶端的連接。
ActionMapping的原理與客戶端相似(相同)。
通過添加相應(yīng)的ObjectAction實(shí)現(xiàn)類,可以實(shí)現(xiàn)不同對象的響應(yīng)、應(yīng)答過程。
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架構(gòu)的客戶端對象,持有該對象,可以隨時(shí)向服務(wù)端發(fā)送消息。 ** 創(chuàng)建時(shí)間:2010-7-18 上午12:17:25 * @author HouLei * @since 1.0 */ public class Client { /** * 處理服務(wù)端發(fā)回的對象,可實(shí)現(xiàn)該接口。 */ 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; //連接狀態(tài) private long lastSendTime; //最后一次發(fā)送數(shù)據(jù)的時(shí)間 //用于保存接收消息對象類型及該類型消息處理的對象 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秒項(xiàng)服務(wù)器發(fā)一個(gè)一個(gè)保持連接的心跳消息 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架構(gòu)的服務(wù)端對象。 ** 創(chuàng)建時(shí)間:2010-7-18 上午12:17:37 * @author HouLei * @since 1.0 */ public class Server { /** * 要處理客戶端發(fā)來的對象,并返回一個(gè)對象,可實(shí)現(xiàn)該接口。 */ 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
以上是“JAVA怎么實(shí)現(xiàn)長連接”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!