Конференция "Сети" » TcpServer и проблема с ним [D7]
 
  • Павел (17.10.09 14:18) [0]
    В программировании не силен, в Delphi тоже,а в сетях особенно,так что прошу сильно не пинать,если вопрос глупый :)
    Допустим код программы такой:program Zombie;
    uses
     Sockets,
     Windows,
     Dialogs;

    var

    SERVER: TTcpServer;

    s: string;
    work:boolean;
    begin

    SERVER:= TTcpServer.Create(NIL);

    SERVER.LocalPort:= '8765';
    SERVER.Active:= True;
    work:=true;

    while work do
     begin
     if SERVER.Accept then ShowMessage('CONNECT!!!');
     SERVER.WaitForData(3000);
     s:=SERVER.Receiveln();
     if s='' then
      begin
      ShowMessage('NO DATA');
      work:=false;
      end;

     end;
    end.
    клиент коннектится,передаю данные,а сервет не принимает...
    Обьясните в чем дело.
  • Сергей М. © (17.10.09 14:54) [1]

    > В программировании не силен, в Delphi тоже,а в сетях особенно


    Тогда с какой луны к тебе свалился этот пример ?
    Почему именно TTcpServer ?
  • Павел (17.10.09 15:25) [2]
    да вот пытался написать консольное приложение...
    Этот пример сам написал,только не работает...
    А если взять другой компонент,например TidServer будеи проще?
  • Сергей М. © (17.10.09 18:51) [3]
    Сначала освой работу компонента в обычном приложении.
    Обработка клиентских соединений должна осуществляться в OnAccept.


    > TidServer будеи проще?


    Нет.
  • Павел (17.10.09 22:00) [4]
    Покопался в Demos там чат есть,в нем клиент и сервер,там вообще с потоками как-то сделано,
    и принимает не сервер а клиент... Зачем тогда сервер нужен? Не понятно...
    Или сервер нужен только чтобы определить входящее подключение? И проверки события onAccept тоже нет... :(
    Вот под свой пример переделал,все работает,только так и не понял как)

    unit Chatmain;

    interface

    uses
     Classes, QControls, QStdCtrls, QExtCtrls, QButtons, QForms, Sockets;

    type
     TForm1 = class(TForm)
       memRecv: TMemo;
       TcpClient1: TTcpClient;
       TcpServer1: TTcpServer;
       
       procedure TcpServer1Accept(sender: TObject;
         ClientSocket: TCustomIpClient);
       procedure btnActivateServerClick(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

     TClientDataThread = class(TThread)
     private
     public
       ListBuffer :TStringList;
       TargetList :TStrings;
       procedure synchAddDataToControl;
       constructor Create(CreateSuspended: Boolean);
       procedure Execute; override;
       procedure Terminate;
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.xfm}

    //------------- TClientDataThread impl -----------------------------------------
    constructor TClientDataThread.Create(CreateSuspended: Boolean);
    begin
     inherited Create(CreateSuspended);
     FreeOnTerminate := true;
     ListBuffer := TStringList.Create;
    end;

    procedure TClientDataThread.Terminate;
    begin
     ListBuffer.Free;
     inherited;
    end;

    procedure TClientDataThread.Execute;
    begin
     Synchronize(synchAddDataToControl);
    end;

    procedure TClientDataThread.synchAddDataToControl;
    begin
    TargetList.AddStrings(ListBuffer);
    end;
    //------------- end TClientDataThread impl -------------------------------------

    procedure TForm1.btnActivateServerClick(Sender: TObject);
    begin
     TcpServer1.LocalPort  := '8765';
     TcpClient1.RemotePort := '5678';
     TcpServer1.Active := True;
     //application.ShowMainForm:=false;
     end;
    procedure TForm1.TcpServer1Accept(sender: TObject;
     ClientSocket: TCustomIpClient);
    var
     s: string;
     DataThread: TClientDataThread;
    begin

     DataThread:= TClientDataThread.Create(true);
     DataThread.TargetList := memRecv.lines;
     TcpClient1.RemoteHost :=ClientSocket.RemoteHost;

    s := ClientSocket.Receiveln;
                                     //while s <> '' do
                                     //begin
    DataThread.ListBuffer.Add(s);
                                    //s := ClientSocket.Receiveln;
                                    //end;

    if s='привет' then
    begin
    try
    if TcpClient1.Connect then
    TcpClient1.Sendln('Доброго времени суток!');
    finally
    TcpClient1.Disconnect;
    end;
    end;
    DataThread.Resume;
    end;

    end.

    Не могли бы вы прокомментировать ключевые моменты?
  • Сергей М. © (18.10.09 18:47) [5]
    Если не собираешься уходить с D7 на последующие версии, то лучше воспользуйся компонентами TServer/ClientSocket (пакет dclsockets70.bpl)
    Если иначе, то скачай и установи пакет ICS (Internet Component Suite).

    А комментировать тут замучаешься - ошибка на ошибке. Проще переделать с нуля на упомянутых выше компонентах.


    > Зачем тогда сервер нужен?


    Здрасть-приехали !

    Ты сейчас читаешь это сообщение благодаря именно серверу)
    А клиентом выступает браузер..
  • Павел (19.10.09 18:42) [6]
    С серверами и клиентами я разобрался)))
    Почему-то думал что слушать должен клиент =)
    и никак не мог понять как (клиентом) ответить клиенту,не зная его порт),потом дошло что сервер отвечать должен)))
    И еще вопрос,могу ли я из одного потока обращаться к переменным другого потока?
    И в чем приимущество TServer перед TTcpServer ну или  в чем различия?
  • Сергей М. © (19.10.09 19:32) [7]

    > могу ли я из одного потока обращаться к переменным другого
    > потока?


    Нет.


    > в чем приимущество TServer перед TTcpServer ну или  в чем
    > различия?


    В режиме threadblocking различия, можно сказать, не ощутимы, т.е. принципиальных различий нет.
    В режиме non-blocking TServerSocket, в отличие от TTcpServer, реализует механизм асинхронных нотификаций о транспортных событиях при помощи оконных сообщений.
 
Конференция "Сети" » TcpServer и проблема с ним [D7]
Есть новые Нет новых   [134438   +31][b:0][p:0]