java socket程式設計 長連結處理
阿新 • • 發佈:2019-02-17
在進行Java socket程式設計的時候,涉及到兩種連結方式,一種是短連線,一種是長連線。當我們在學習網路程式設計TCP的時候,一般都只是涉及到短連線程式設計,很少會涉及到長連線,那麼什麼是長連線,什麼是短連線呢?
1.概念:
短連線:指建立SOCKET連線後傳送後接收完資料後馬上斷開連線,比如http,只是連線、請求、關閉,過程時間較短,伺服器若是一段時間內沒有收到請求即可關閉連線。
長連線:指建立SOCKET長連線就指的是一直保持連線,不管當前是否傳送或者接收資料。 如果雙方都沒有一方對這個連結做處理操作的話,那麼這個連結保持連結狀態,這是非常不安全的。
2.使用時機:
長連線:
短連線: web網站的http服務一般都用短連線。因為長連線對於伺服器來說要耗費一定的資源。像web網站這麼頻繁的成千上萬甚至上億客戶端的連線用短連線更省一些資源。試想如果都用長連線,而且同時用成千上萬的使用者,每個使用者都佔有一個連線的話,可想而知伺服器的壓力有多大。所以併發量大,但是每個使用者又不需頻繁操作的情況下需要短連線。
當使用長連線處理通訊的時候,會遇到的第一個問題就是在規定的時間內,如果雙方沒有通訊的時候,我們如何斷開連結,減少伺服器資源呢?
程式碼附上:
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import com.aoChine.util.CloseUtil;
/**
* 排程執行緒,對應對處理每個請求的資料
* @author 奔跑的浮雲
*/
public class ServerTest implements Runnable {
private Socket client;
boolean running = true;
public ServerTest(Socket client) {
this.client = client;
}
@Override
public void run() {
long lastReceiveTime = System.currentTimeMillis(); // 最後一次傳送資料的時間
long receiveTimeDelay = 1000 * 10; // 超時時間
InputStream in = null;
try {
in = client.getInputStream();
while (running) {
if (System.currentTimeMillis() - lastReceiveTime > receiveTimeDelay) { //規定時間內沒有資料傳送
System.out.println("長時間沒有資訊傳送,伺服器自動斷開連線");
// 長時間未傳送資料
over();
} else {
if ((in.available()) > 0) {
int len = 0;
StringBuffer data = new StringBuffer();
byte[] buf = new byte[1024];
while ((len = in.read(buf)) != -1) {
data.append(new String(buf, 0, len));
}
// 修改過期時間
lastReceiveTime = System.currentTimeMillis();
// 從新開啟一個執行緒來處理資料,減少這個方法中的業務邏輯
new Thread(new NMEA0183(data.toString())).start();
} else {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
over(); //記得關閉
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
over();
}
}
/**
* 關閉Socket
*/
private void over() {
if (running)
running = false;
if (client != null) {
CloseUtil.closeSocket(client);
}
}
}