2011-01-05 21 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

什麼是錯誤?什麼是發送數據? – 2011-01-05 19:57:49

+0

請詳細說明真正的含義_it不工作_ – jachguate 2011-01-05 20:44:03

回答

-1

用Socket參數替換ServerSocket1.Socket並再次測試。刪除for循環的步驟

+0

對不起,但我不明白你。你想用Socket Param說什麼。 – 2011-01-05 21:21:48

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嗎?如果我可以......怎麼樣? – 2011-01-06 16:38:45

+0

當然可以。如果您想從服務器的一個事件處理程序內發送數據,則只需使用該事件提供的相同'TCustomWinSocket'對象。否則,您必須在服務器的'Connections []'列表中找到所需的客戶端,然後發送到該套接字。 – 2011-01-06 21:06:10

+0

另外,請記住,如果服務器以非阻塞模式運行,並且您嘗試發送的數據超過套接字在給定時間可以處理的數據,則發送將失敗,並顯示WSAEWOULDBLOCK錯誤代碼,則必須緩存無論待處理的數據是多少,並等待服務器的OnClientWrite事件被觸發,然後再發送更多數據到同一個套接字。 – 2011-01-06 21:07:56

相關問題