【问题标题】:TServerSocket: Confusion with Socket ObjectsTServerSocket:与套接字对象混淆
【发布时间】:2010-11-12 22:52:18
【问题描述】:

所以我有这个应用程序来验证用户是否可以登录的天气。

它由多个客户端(最多 200 个)和一个处理登录查询(包含用户名、密码和 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 发送他的登录数据并从服务器接收用户有效的布尔值(上面的代码)。当 uservalid boolean 写入套接字连接时,会发生以下情况:就在 ClientA 可以获取 uservalid boolean(应该是)之前,已经登录的 ClientB 从套接字读取并获取(因为它不应该是)用户有效的布尔值。

这可以通过每个客户端使用一个套接字进行干预。对吧?

【问题讨论】:

    标签: delphi sockets client-server


    【解决方案1】:

    通常,您的服务器套接字不会将其传出消息广播到所有连接的客户端。相反,它将选择一个特定的连接客户端来发送响应。将来自不同客户端的所有这些连接视为独一无二的。当然,它们可能有一些共同的设置,但它们是独特的联系。 (在数据库中,连接的主键是所有服务器 IP、服务器端口、客户端 IP、客户端端口的组合)

    我没有使用过 TServerSocket,但是IPWorks 库通过使用在接收端和发送端都指定的连接 ID 来明确这一点。这样您就知道您正在读取/写入的数据将使用特定的连接,并且数据来自/到预期的客户端。

    【讨论】:

      【解决方案2】:

      TServerSocket.OnClientRead 的 Socket:TCustomWinSocket 参数仅表示您的一个客户端和服务器之间的一个连接。因此,当客户端Foo发送登录记录,并调用TServer_Form.ServerSocketClientRead时,只需说

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

      然后您会将数据发送给正确的客户端。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        • 2015-06-26
        • 1970-01-01
        • 2012-02-11
        • 2015-12-15
        • 2011-03-04
        • 2012-03-04
        相关资源
        最近更新 更多