2009-07-22 15 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; 

Serverは現在、読み取ります

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ブール(上記のコードを)recieves。 uservalid booleanがソケット接続に書き込まれると、次のようになります。ClientAがuservalid booleanを取得できる直前(それがそうであるはずです)ClientBは既にログインしています。ソケットから読み込みます。 uservalid boolean。

これは、クライアントごとに1つのソケットを使用して行うことができます。右?

答えて

2

TServerSocket.OnClientReadのソケット:TCustomWinSocketパラメータは、クライアントとサーバーの間の1つの接続を表します。したがって、クライアントはFooは、ログインレコードを送信し、TServer_Form.ServerSocketClientReadが呼び出されたときに、ちょうど

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

を言うと、あなたは右のクライアントにデータをお送りします。

0

通常、サーバーソケットは、接続されているすべてのクライアントに送信メッセージをブロードキャストすることはありません。代わりに、応答を送信するために1つの特定の接続クライアントを選択します。異なるクライアントからのすべての接続が一意であると考えてください。確かに、いくつかの共通の設定があるかもしれませんが、それらは一意の接続です。 (データベースの話では、接続のプライマリキーはサーバIP、サーバポート、クライアントIP、クライアントポートのすべての組み合わせです)

私はTServerSocketを使用していませんが、IPWorksライブラリは受信側と送信側の両方で指定された接続IDを使用します。このようにして、あなたが読んでいる/書いているデータが特定の接続を使用しており、そのデータが予想されるクライアントとの間でやりとりされていることがわかります。