Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.05.13;
Скачать: CL | DM;

Вниз

TcpServer и проблема с ним   Найти похожие ветки 

 
Павел   (2009-10-17 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.
клиент коннектится,передаю данные,а сервет не принимает...
Обьясните в чем дело.


 
Сергей М. ©   (2009-10-17 14:54) [1]


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


Тогда с какой луны к тебе свалился этот пример ?
Почему именно TTcpServer ?


 
Павел   (2009-10-17 15:25) [2]

да вот пытался написать консольное приложение...
Этот пример сам написал,только не работает...
А если взять другой компонент,например TidServer будеи проще?


 
Сергей М. ©   (2009-10-17 18:51) [3]

Сначала освой работу компонента в обычном приложении.
Обработка клиентских соединений должна осуществляться в OnAccept.


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


Нет.


 
Павел   (2009-10-17 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.

Не могли бы вы прокомментировать ключевые моменты?


 
Сергей М. ©   (2009-10-18 18:47) [5]

Если не собираешься уходить с D7 на последующие версии, то лучше воспользуйся компонентами TServer/ClientSocket (пакет dclsockets70.bpl)
Если иначе, то скачай и установи пакет ICS (Internet Component Suite).

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


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


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

Ты сейчас читаешь это сообщение благодаря именно серверу)
А клиентом выступает браузер..


 
Павел   (2009-10-19 18:42) [6]

С серверами и клиентами я разобрался)))
Почему-то думал что слушать должен клиент =)
и никак не мог понять как (клиентом) ответить клиенту,не зная его порт),потом дошло что сервер отвечать должен)))
И еще вопрос,могу ли я из одного потока обращаться к переменным другого потока?
И в чем приимущество TServer перед TTcpServer ну или  в чем различия?


 
Сергей М. ©   (2009-10-19 19:32) [7]


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


Нет.


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


В режиме threadblocking различия, можно сказать, не ощутимы, т.е. принципиальных различий нет.
В режиме non-blocking TServerSocket, в отличие от TTcpServer, реализует механизм асинхронных нотификаций о транспортных событиях при помощи оконных сообщений.



Страницы: 1 вся ветка

Текущий архив: 2012.05.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.006 c
6-1255774690
Павел
2009-10-17 14:18
2012.05.13
TcpServer и проблема с ним


2-1325831953
BeginMan
2012-01-06 10:39
2012.05.13
Как осуществить выборку по диапазонам дат.


2-1326300960
Gu
2012-01-11 20:56
2012.05.13
константы


15-1326000412
Jimmy
2012-01-08 09:26
2012.05.13
Красивый Label


4-1256672610
cerber
2009-10-27 22:43
2012.05.13
Изменить привилегии доступа к ветке реестра