2009-07-22 109 views
3

所以我有這個應用程序來驗證天氣用戶可以登錄或不。TServerSocket:與套接字對象混淆

它由多個客戶端(最多200個)和一個處理登錄查詢(包含用戶名,PW和IP)的服務器組成。服務器檢查用戶存在的天氣併發回答案。

TLoginQuery是一個記錄。

procedure TLogin_Form.btnLoginClick(Sender: TObject); 
var LoginQuery1: TLoginQuery; 
begin 
if not LoginSocket.Active then 
    begin 
    LoginSocket.Open; 
    end; 

//Paketchen schnüren. 
LoginQuery1.Name := ledtName.Text; 
LoginQuery1.Passwort := ledtPasswort.Text; 
LoginQuery1.IP := LoginSocket.Socket.LocalAddress; 
//LoginQuery ín den Socket legen. 
LoginSocket.Socket.SendBuf(LoginQuery1, SizeOf(LoginQuery1)); 

end; 

服務器當前讀取:

procedure TServer_Form.ServerSocketClientRead(Sender: TObject; 
Socket: TCustomWinSocket); 
var LoginQuery: TLoginQuery; 
    uservalid: boolean; 
begin 
uservalid := false; 
Socket.ReceiveBuf(LoginQuery, SizeOf(LoginQuery)); 
if CheckIfUserValid(LoginQuery) then 
    begin 
    uservalid := true; 
    ServerSocket.Socket.SendBuf(uservalid, SizeOf(uservalid)); 
    end; 

end; 

現在的問題是: 服務器是否(因爲它一般應)創建每個客戶不同的套接字連接?

我的假設:

客戶端A將他的登錄數據和臨危從服務器uservalid布爾(上面的代碼)。當uservalid布爾值寫入套接字連接時,會發生以下情況:就在ClientA可以獲取uservalid布爾值(因爲它應該是)之前,已經登錄的ClientB從套接字讀取並獲取(因爲它不應該) uservalid布爾值。

這可以使用每個客戶端的一個套接字進行干預。對?

回答

2

TServerSocket.OnClientRead的套接字:TCustomWinSocket參數表示您的一個客戶端和服務器之間的那一個連接。因此,當客戶機富發送登錄記錄,並TServer_Form.ServerSocketClientRead叫,只是說

if CheckIfUserValid(LoginQuery) then 
    begin 
    uservalid := true; 
    Socket.SendBuf(uservalid, SizeOf(uservalid)); 
    end; 

,你就會將數據發送到正確的客戶端。

0

通常,您的服務器套接字不會將其傳出消息廣播到所有連接的客戶端。相反,它將選擇一個特定的連接客戶端來發送響應。把所有來自不同客戶的連接想象成獨一無二的。當然,他們可能有一些共同的設置,但它們是獨特的連接。 (在數據庫中,連接的主鍵是所有服務器IP,服務器端口,客戶端IP,客戶端端口的組合)

我沒有使用過TServerSocket,但IPWorks庫使得使用在接收方和發送方都指定的連接ID。通過這種方式,您知道您正在讀/寫的數據將使用特定的連接,並且數據來自預期的客戶端。