2009-07-22 88 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。通过这种方式,您知道您正在读/写的数据将使用特定的连接,并且数据来自预期的客户端。