Q&A

  • 인디9 TCP 서버통신 에서 client 식별은 어떻게...
인디9 TCP통신서버와 복수의 클라이언트 통신에 있어
1. 각각의 클라이언트의 요청에 대해 서버에서 응답은 하는데,
2. 클라이언트의 요청이 없을 때 서버에 접속되어 있는 복수의 클라이언트 중 선택해서
    통신은 어떻게 하는지 방법이 없나요?
    (아래코드를 보면 서버에서 AThread.Connection.WriteLn('')으로  응답을 해야하는데
    클라이언트 선택부분이 없는 것 같아요.)

procedure TfrmMain.IdTCPServerExecute(AThread: TIdPeerThread);
var
    Command : String;
begin
    Command := AThread.Connection.ReadLn;
    Command := uppercase(Command);
    if Command = 'TIME' then
       AThread.Connection.WriteLn(FormatDateTime('hh:nn:ss',now))
    else if Command = 'DATE' then
       AThread.Connection.WriteLn(FormatDateTime('dd/mmm/yyyy',date))
    else if Command = 'TICKCOUNT' then
       AThread.Connection.WriteInteger(GetTickCount)
    else if Command = 'QUIT' then
    begin
       AThread.Connection.WriteLn('Goodbye!');
       AThread.Connection.Disconnect;
    end
    else AThread.Connection.WriteLn('Command not recognised - try again!')
end;
=끝=
3  COMMENTS
  • Profile
    천희택 2006.01.17 01:22
    <!--CodeS-->
    procedure TForm1.Button1Click(Sender: TObject);
    var i : integer;
        ClientList : TList;
        IdPeerThread : TIdPeerThread;
        ClientHost : string;
        ClientPort : integer;
    begin
        ClientList := IdTCPServer1.Threads.LockList;
        for i := 0 to ClientList.Count - 1 do
        begin
            IdPeerThread := TIdPeerThread(ClientList.Items[i]);

            ClientHost := IdPeerThread.Connection.Socket.Binding.PeerIP;
            ClientPort := IdPeerThread.Connection.Socket.Binding.PeerPort;
            //클라이언트의 IP와 Port를 알고 있으므로 이를 가지고 선택해서
            //통신이 가능합니다.
        end;
        IdTCPServer1.Threads.UnlockList;
    end;

    <!--CodeE-->

    직접 확인은 안 해봤지만.. 될 겁니다... -_-;;;


  • Profile
    신철우 2006.01.17 18:50
    감사합니다. 그런데 아래 중간에
    IdPeerThread.Connection.WriteLn('꾀꼴'); 이라고 클라이언트에 메시징을 했더니 깜깜이군요.

    서버에 IdTCPServer외에 IdTCPClient를 1개 더 만들어 클라이언트(IdTCPServer를 추가)를 호출하여 메시지를 보내야하나요.
    상세한 서버코드와 클라이언트 코드를 좀 알려줄 수는 없는지요?



    //
              IdPeerThread.Connection.WriteLn('꾀꼴');  //요게 안나가는건지 클라이언트에서 못받는 건지요?

  • Profile
    최용일 2006.01.17 22:02
    안녕하세요. 최용일입니다.

    인디는 블러킹방식이라서 클라이언트에서 보내고 그 응답을 서버로부터 받는 방식이 아니라 임의의 시점에서 서버로부터 메세지를 받는 방식이라면 쓰레드를 돌려서 클라이언트가 서버로부터의 응답을 받을 수 있도록 대기하여야 합니다.

    ^^ 항상 즐코하세요...