Socket 長連線 短連線 心跳 JAVA SOCKET程式設計
阿新 • • 發佈:2019-02-06
簡單解釋就是:
短連線:建立連線,傳送資料包,關閉連線
長連線:建立連線,傳送資料包,傳送心跳包,傳送資料包,傳送心跳包,傳送心跳包。。。。。。
所以又頻繁的資料收發的話,短連線會頻繁建立TCP連線,而對於長連線,則始終用的是同一個TCP連線
package com.tree.demo.socket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerSocketDemo { private static final int PORT = 1234; private static final int BUFFER_SIZE = 1024; public static void main(String[] args) { // TODO Auto-generated method stub try { ServerSocket ss = new ServerSocket(PORT); Socket s = ss.accept(); System.out.println("這是服務端,監聽本機"+PORT+"埠"); byte[] recData = null; InputStream in = s.getInputStream(); OutputStream out = s.getOutputStream(); while(true) { recData = new byte[BUFFER_SIZE]; int r = in.read(recData); //int r = in.read(recData); if(r>-1) { String data = new String(recData); if(data.trim().equals("over")) { s.close(); } System.out.println("讀取到客戶端傳送的來資料:"+data); out.write("這是服務端發給客戶端的資料:".getBytes()); out.write(recData); }else { System.out.println("資料讀取完畢!"); s.close(); System.exit(0); //ss.close(); } } } catch (IOException e) { e.printStackTrace(); } } }
以上這種服務端讀資料是阻塞式,如果客戶端沒有資料寫過來,服務端就會一直阻塞在那不動
客戶端開啟一個telnet即可測試服務端的socket程式了,當然你也可以自己寫一個socket客戶端,如下:
同時這要是一個心跳的例項,心跳只要不出現異常的情況下,可以直接使用client連線傳送資料包,不需要new socket新建連線了。package socket; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class ClientSocketDemo { private static final String HOST = "192.168.8.14"; private static final int PORT = 1234; public static void main(String[] args) throws UnknownHostException, IOException { Socket client = new Socket(HOST, PORT); OutputStream out = client.getOutputStream(); try { while (true) { Thread.sleep(1000); System.out.println("傳送心跳資料包"); out.write("send heart beat data package !".getBytes()); } } catch (Exception e) { e.printStackTrace(); out.close(); client.close(); } } }
accept()等待連線,該方法阻塞當前執行緒直到建立連線為止
以上服務端的網路程式只能和一個客戶端程式連線,拒絕多個客戶端的連線。
我們可以通過執行緒來解決這個問題:每當程式建立一個新的套接字連線,也就是呼叫accept方法時,將啟動一個新的執行緒來處理伺服器和客戶端的連線,而主程式將立即返回並等待下一個連線。