伺服器是如何處理多個用戶的請求
『壹』 伺服器同時接收到多條請求會怎麼處理
理論上有多少塊CPU就可以同時處理多少請求,如果同時有多個請求過來一般會根據時間和優先順序排序,先處理優先順序高+先到達的。
另外,什麼叫同時收到?一彈指含二十瞬,一瞬含二十念,一念含九十剎那,一剎那含九百萬生滅,到CPU那兒再怎麼快也能給你分出先來後到。
『貳』 java程序完成伺服器和客戶端的SOCKET通訊,要求伺服器使用多線程接收和處理多個客戶端訪問請求
1. 客戶端程序
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
//向本機的4700埠發出客戶請求
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系統標准輸入設備構造BufferedReader對象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由Socket對象得到輸出流,並構造PrintWriter對象
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket對象得到輸入流,並構造相應的BufferedReader對象
String readline;
readline=sin.readLine(); //從系統標准輸入讀入一字元串
while(!readline.equals("bye")){
//若從標准輸入讀入的字元串為 "bye"則停止循環
os.println(readline);
//將從系統標准輸入讀入的字元串輸出到Server
os.flush();
//刷新輸出流,使Server馬上收到該字元串
System.out.println("Client:"+readline);
//在系統標准輸出上列印讀入的字元串
System.out.println("Server:"+is.readLine());
//從Server讀入一字元串,並列印到標准輸出上
readline=sin.readLine(); //從系統標准輸入讀入一字元串
} //繼續循環
os.close(); //關閉Socket輸出流
is.close(); //關閉Socket輸入流
socket.close(); //關閉Socket
}catch(Exception e) {
System.out.println("Error"+e); //出錯,則列印出錯信息
}
}
}
2. 伺服器端程序
import java.io.*;
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
//創建一個ServerSocket在埠4700監聽客戶請求
}catch(Exception e) {
System.out.println("can not listen to:"+e);
//出錯,列印出錯信息
}
Socket socket=null;
try{
socket=server.accept();
//使用accept()阻塞等待客戶請求,有客戶
//請求到來則產生一個Socket對象,並繼續執行
}catch(Exception e) {
System.out.println("Error."+e);
//出錯,列印出錯信息
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket對象得到輸入流,並構造相應的BufferedReader對象
PrintWriter os=newPrintWriter(socket.getOutputStream());
//由Socket對象得到輸出流,並構造PrintWriter對象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系統標准輸入設備構造BufferedReader對象
System.out.println("Client:"+is.readLine());
//在標准輸出上列印從客戶端讀入的字元串
line=sin.readLine();
//從標准輸入讀入一字元串
while(!line.equals("bye")){
//如果該字元串為 "bye",則停止循環
os.println(line);
//向客戶端輸出該字元串
os.flush();
//刷新輸出流,使Client馬上收到該字元串
System.out.println("Server:"+line);
//在系統標准輸出上列印讀入的字元串
System.out.println("Client:"+is.readLine());
//從Client讀入一字元串,並列印到標准輸出上
line=sin.readLine();
//從系統標准輸入讀入一字元串
} //繼續循環
os.close(); //關閉Socket輸出流
is.close(); //關閉Socket輸入流
socket.close(); //關閉Socket
server.close(); //關閉ServerSocket
}catch(Exception e){
System.out.println("Error:"+e);
//出錯,列印出錯信息
}
}}
『叄』 伺服器如何實現承受如此大量的用戶請求
首先以網站和游戲伺服器為例。是否每一位用戶都將自己的請求發送到同一IP地址,實際應用中他們只將請求發送到同一域名,不一定是同一IP地址。在此,伺服器對待這些請求,是否只有兩種處理方式: 一種獨立完成 另一種先用一台伺服器接收下來,然後通過某種方式將請求分發給其他伺服器. 如果都指向同一IP地址的話,是。但如何實現「另一種」有很多種方法。可否就"伺服器分發請求"這種方式簡述一下實現。此類技術統稱Load Balancing,根據你的服務需要可以在TCP/IP棧的上四層的任何一層實現。每一層又有不同的實現方法。具體的大概讀一讀相關文檔更容易。是否不論是以上哪兩種,這其中必然會有一個集中處理的過程。你既然已經要求到達同一IP了,自然這個IP上就要集中處理。當然對於大多數業務後台也會集中處理,不過不在此題目之限。若存在一個集中處理的過程,像網路這樣的網站,又是如何做到讓集中接收請求的那台機器不被大量的用戶請求淹沒,首先你的硬體要足夠強大。
『肆』 伺服器如何實現承受如此大量的用戶請求
首先我想說樓主的提問列表很程序員,從0開始的。
這個當然是不一定的,樓主已經知道問題是負載均衡了,現在大型伺服器一般都會做成分布式的。
其實你說的意思應該是直接處理這個請求還是我找另外一個機器處理你的請求。
伺服器分發請求有很多種策略,舉個簡單的例子。某個伺服器在登錄的時候根據用戶的ID取模,然後選擇對應的一台機器進行轉發,這是一種比較簡單的分發請求策略了。再比如很多游戲伺服器會分網通、電信等大區,然後大區下有分1,2,3...多個房間,這些其實都是分發請求的例子。
根據你的業務類型,可能會存在一個必須有集中處理的過程。比如登錄校驗這個過程,所有的請求最終都要去查詢db,那麼如果db只有一台的話就會存在你說的集中處理情況。現在的開發很聰明的,無論是高並發還是容災都不會只搞一台db的,他們可以分庫分表,可會主從備份,甚至是讀寫分離。
在設計伺服器的時候,肯定會相對會有4中的情況,我們當然不希望因為4中的情況而影響整個伺服器的性能。
我們可以把分發策略放在客戶端,比如登錄的時候在客戶端進行選擇,直接登錄到負載較低的伺服器上。你會說客戶端查詢各個伺服器的負載情況這個功能介面會壓力很大,其實不做IO操作的話,僅僅是獲取內存中的數據性能會很高的。
如果樓主需要進行伺服器壓力測試的話可以試試騰訊公司的一款工具WeTest伺服器性能,用來測試伺服器各個介面的性能情況很有效,附個鏈接:http://wetest.qq.com/gaps/。