-
В программировании не силен, в 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. клиент коннектится,передаю данные,а сервет не принимает... Обьясните в чем дело.
-
> В программировании не силен, в Delphi тоже,а в сетях особенно
Тогда с какой луны к тебе свалился этот пример ? Почему именно TTcpServer ?
-
да вот пытался написать консольное приложение... Этот пример сам написал,только не работает... А если взять другой компонент,например TidServer будеи проще?
-
Сначала освой работу компонента в обычном приложении. Обработка клиентских соединений должна осуществляться в OnAccept.
> TidServer будеи проще?
Нет.
-
Покопался в 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.
Не могли бы вы прокомментировать ключевые моменты?
-
Если не собираешься уходить с D7 на последующие версии, то лучше воспользуйся компонентами TServer/ClientSocket (пакет dclsockets70.bpl) Если иначе, то скачай и установи пакет ICS (Internet Component Suite).
А комментировать тут замучаешься - ошибка на ошибке. Проще переделать с нуля на упомянутых выше компонентах.
> Зачем тогда сервер нужен?
Здрасть-приехали !
Ты сейчас читаешь это сообщение благодаря именно серверу) А клиентом выступает браузер..
-
С серверами и клиентами я разобрался))) Почему-то думал что слушать должен клиент =) и никак не мог понять как (клиентом) ответить клиенту,не зная его порт),потом дошло что сервер отвечать должен))) И еще вопрос,могу ли я из одного потока обращаться к переменным другого потока? И в чем приимущество TServer перед TTcpServer ну или в чем различия?
-
> могу ли я из одного потока обращаться к переменным другого > потока?
Нет.
> в чем приимущество TServer перед TTcpServer ну или в чем > различия?
В режиме threadblocking различия, можно сказать, не ощутимы, т.е. принципиальных различий нет. В режиме non-blocking TServerSocket, в отличие от TTcpServer, реализует механизм асинхронных нотификаций о транспортных событиях при помощи оконных сообщений.
|