簡體   English   中英

TServerSocket:與套接字對象的混淆

[英]TServerSocket: Confusion with Socket Objects

所以我有這個應用程序來驗證用戶可以登錄或不登錄的天氣。

它由多個客戶端(最多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;

現在的問題是:服務器(通常應該是這樣)是否為每個客戶端創建不同的套接字連接?

我的假設:

ClientA發送他的登錄數據並從服務器接收用戶有效的布爾值(上面的代碼)。 當用戶有效的布爾值被寫入套接字連接時,會發生以下情況:在ClientA可以獲得uservalid布爾值之前(應該是這樣)ClientB已經登錄,從套接字讀取並獲取(因為它不應該) uservalid boolean。

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

TServerSocket.OnClientRead的Socket:TCustomWinSocket參數表示您的一個客戶端與服務器之間的一個連接。 因此,當客戶端Foo發送登錄記錄,並且調用TServer_Form.ServerSocketClientRead時,只需說

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

並且您將數據發送給正確的客戶端。

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

我沒有使用過TServerSocket,但IPWorks庫通過使用在接收方和發送方都指定的連接ID來明確這一點。 這樣您就知道您正在讀/寫的數據將使用特定的連接,並且數據來自/到期望的客戶端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM