在服務器我們同時運行tomcat 和我們的Socket服務端,客服端通過短連接向tomcat發送資料,并且客服端和我們的Socket服務端保持一個長連接,Socket服務端把所有連接到服務端的Socket保存到一個鏈表中,而不是開辟執行緒來監聽客戶端是否發送其它請求。在我們需要主動向客戶端推送資訊(比如聊天資訊)的時候,tomcat服務器首先向Socket服務端發送該資訊,Socket服務端到鏈表中取出對應客戶端的Socket連接并發送該資訊。
問題:
1、不能通過心跳資料包來確保連接是否正常,因為客戶端不能直接向服務端發送資料,否則服務端將為每個連接開辟執行緒來監聽是否有資料。
2、在連接鏈量較大且需頻繁發送資料的時候會頻繁查找鏈表,會造成資訊延遲高。(哦,突然想到可以通過遞增的id來標識每個連接,查找時應該可以直接定位到該連接,那影響速度的應該就是帶寬了)。
3、因為客戶端不直接聯系服務端,所以它們不能快速的確定連接已斷開,并且進行重連和清理資料。
4、原諒小白暫時想不到其它問題了,盡管問題還很多。
經測驗在連接數(僅僅連接和保存在鏈表中而不進行其它任務)達到10000的時候,服務端的記憶體占用在30+MB,如果在解決了以上1、2、3點的情況下,用這個Socket服務端來進行訊息推送,他的效率會怎么樣?或者它會不會成功作業?
以下是測驗代碼
public class SocketReciever {
private ServerSocket listen = null;
private List<CusSocket> conns = null;
public static void main(String[] args) throws FileNotFoundException {
int id = 0;
SocketReciever reciever = new SocketReciever();
List<CusSocket> conns = reciever.getConns();
FileOutputStream fos = new FileOutputStream("log.txt", true);
PrintStream ps = new PrintStream(fos);
try {
while(true){
Socket socket = reciever.getServerSocket().accept();
conns.add(new CusSocket(id++, socket));
OutputStream oStream =socket.getOutputStream();
oStream.write(String.valueOf(new Date().getTime()).getBytes("utf-8"));
oStream.write(-1);
}
} catch (IOException e) {
e.printStackTrace(ps);
}
}
public SocketReciever() {
try {
listen = new ServerSocket(23220);
} catch (IOException e) {
e.printStackTrace();
}
conns = new ArrayList<CusSocket>();
}
public ServerSocket getServerSocket(){
return listen;
}
public List<CusSocket> getConns(){
return conns;
}
}
public class CusSocket {
public int flag;
public Socket socket;
public CusSocket(int flag, Socket socket) {
this.socket = socket;
this.flag = flag;
}
}
還有些問題:當我們建立一個TCP連接的時候,系統會開辟記憶體來儲存Socket物件,交換資料的時候會占用帶寬,那不交換資料的時候會占用帶寬嗎?TCP連接還會消耗哪些資源?
也許想法很爛,寫得還很爛,但是,請不喜勿噴,請文明批評。
uj5u.com熱心網友回復:
沒有人光顧,只有自己頂了
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/102606.html
標籤:網絡通信
