Форум: "Сети";
Текущий архив: 2012.05.13;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c