2011-01-05 2 views
2

私はこのコードを使用してデータを暴露します: しかし、それは仕事ではありません。TServerSocketとTClientSocket

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; 
    Socket: TCustomWinSocket); 
var 
    i:integer; 
    sRec : string; 
begin 
    for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do 
    begin 
    with ServerSocket1.Socket.Connections[i] do 
    begin 
     sRec:=ReceiveText; 
     if sRec <> '' then 
     begin 
     if RemoteAddress='192.168.0.1' then 
     begin 
      if ReceiveText='1' then 
      Btn1.Color:=clNavy; 
      ADOQuery1.Active:=True; 
     end; 
     if RemoteAddress='192.168.0.1' then 
     begin 
      if ReceiveText='2' then 
      Btn1.Color:=clRed; 
      Pnl1.Visible:=True; 
     end; 
     end; 
    end; 
    end; 
end; 
+0

エラーは何ですか?データの送信は何ですか? –

+0

実際に何がうまく動作しないのかを具体的に説明してください。 – jachguate

答えて

-1

ServerSocket1.SocketをSocket paramに置き換えてもう一度テストします。 forループを削除するには

+0

申し訳ありませんが、あなたを理解できません.Socket Paramで何を言いたいのですか? –

3

クライアントがデータを送信するたびにTServerSocket.Socket.Connectionsリストのすべてのクライアント接続から読み取ろうとしています。代わりにイベントが提供するTCustomWinSocketパラメータを使用している必要があります。これは、データを送信している正確なクライアントを示します。

また、コードには他のロジックエラーもあります。

は、代わりにこれを試してみてください:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); 
var 
    sRec : string; 
begin 
    sRec := Socket.ReceiveText; 
    if sRec <> '' then 
    begin 
    if Socket.RemoteAddress = '192.168.0.1' then 
    begin 
     if sRec = '1' then Btn1.Color := clNavy; 
     ADOQuery1.Active := True; 
     if sRec = '2' then Btn1.Color := clRed; 
     Pnl1.Visible := True; 
    end; 
    end; 
end; 

それともあなたはより多くのこのような何かを意味しましたか?

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); 
var 
    sRec : string; 
begin 
    sRec := Socket.ReceiveText; 
    if sRec <> '' then 
    begin 
    if Socket.RemoteAddress = '192.168.0.1' then 
    begin 
     if sRec = '1' then begin 
     Btn1.Color := clNavy; 
     ADOQuery1.Active := True; 
     end 
     else if sRec = '2' then begin 
     Btn1.Color := clRed; 
     Pnl1.Visible := True; 
     end; 
    end; 
    end; 
end; 
+0

完璧に動作します。ありがとうございます。 TServerSocketからTClientSocket ???にデータを送ることができますか?もしできれば...どうすればいいですか? –

+0

もちろん可能です。サーバーのイベントハンドラの1つの内部からデータを送信する場合は、イベントが提供するのと同じ 'TCustomWinSocket'オブジェクトを使用します。それ以外の場合は、サーバーの 'Connections []'リストで目的のクライアントを見つけて、そのソケットに送信する必要があります。 –

+0

また、サーバーがノンブロッキングモードで実行されていて、ソケットが特定の瞬間に処理できるデータよりも多くのデータを送信しようとすると、WSAEWOULDBLOCKエラーコードで送信が失敗し、キャッシュする必要があります保留中のデータがあれば、サーバーのOnClientWriteイベントが発生するまで待機してから、同じソケットにさらにデータを送信してください。 –

関連する問題