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

미안하지만 당신을 이해하지 못합니다. 소켓 매개 변수로 무엇을 말하고 싶습니까? –

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

물론 가능합니다. 서버의 이벤트 핸들러 중 하나에서 데이터를 보내려면 이벤트가 제공하는 것과 동일한'TCustomWinSocket' 객체를 사용하면됩니다. 그렇지 않으면 서버의'Connections []'목록에서 원하는 클라이언트를 찾은 다음 그 소켓으로 보내야합니다. –

+0

또한 서버가 비 블로킹 모드에서 실행 중이고 소켓이 주어진 순간에 처리 할 수있는 것보다 많은 데이터를 보내려고하면 WSAEWOULDBLOCK 오류 코드로 전송이 실패하고 캐시해야합니다 어떤 보류중인 데이터라도 남겨두고 동일한 소켓에 데이터를 다시 보내기 전에 서버의 OnClientWrite 이벤트가 시작될 때까지 기다립니다. –

관련 문제