![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как реализовать чтоб сервре и клиент слушали порт? [D7, Win95/98, Win2k, WinXP]
h0use © (2003-11-25 17:14:00)
Есть сервак, у которого в методе OnExecute
procedure TFM.TCPServerExecute(AThread: TIdPeerThread);
var
AMsg : TCommBlock;
Msg : String;
begin
if not AThread.Terminated and AThread.Connection.Connected then
try
Msg:=AThread.Connection.ReadLn;
if Msg="" then exit;
AThread.Connection.ReadBuffer(AMsg,SizeOf(AMsg));
ShowMessage(IntToStr(AMsg.Command)+IntToStr(AMsg.Argument1)+IntToStr(AMsg.Argument2)+AMsg.Msg);
case AMsg.Command of //
cmdLogin : ServerLogin(AMsg,AThread);
cmdLogout : ServerLogout(AMsg,AThread);
cmdCommand: ServerCommand(AMsg,AThread);
cmdSQL : ServerSQL(AMsg,AThread);
cmdMessage: ServerChat(AMsg,AThread);
end; // case
except
on E: Exception do
SaveLog(0,3,"Socket read error: " + e.Message);
end;
end; // TCPServerExecute
Работает и сам сервак не виснет, но в клиенте в процедуре
procedure TfmMain.TimerTimer(Sender: TObject);
var
AMsg: TCommBlock;
Msg : String;
begin
if (not TCPClient.Connected) then exit;
try
Msg:=TCPClient.ReadLn(#10,50); <------------- Вот здесь висим после первого обмена информацией
if Msg="<<<" then
begin
TCPClient.ReadBuffer(AMsg,SizeOf(AMsg));
case AMsg.Command of //
cmdLogin : ClientConnect(AMsg);
cmdLogout: ClientDisconnect(AMsg);
end; // case
end;
except
on e: Exception do
ShowMessage(e.Message);
end; // try/except
Application.ProcessMessages;
end;
Как сделать так, чтоб клиент при ожидании какой-либо инфы от сервера не вис?
Reindeer Moss Eater (2003-11-26 12:10:00) [41]
Код твоего клиента - одно сплошное недоразумение.
Таймер там что делает?
h0use (2003-11-26 11:54:00) [42]
Это я понял, но, у меня даже при установке флага OnlyWhenIdle в False все равно прикладуха виснет :(
Reindeer Moss Eater (2003-11-26 11:31:00) [43]
"Кидать" его надо в GUI приложение.
Если синхронные методы библиотеки вызываются из главного потока приложения и если требуется обеспечить доступность UI во время работы.
Один экземпляр на все приложение.
Если свойство Active равно True, то пользовательский интерфейс не будет "засыпать" во время выполнения синхронных методов.
h0use (2003-11-26 10:42:00) [44]
Нет, я не нашел примера, а просто кидать его на форму не приводит к каим либо изменениям, потом вообще не понятно куда его кидать, на сервер или клиент, или обоим сразу
Reindeer Moss Eater (2003-11-26 10:36:00) [45]
Ты уже попробовал изпользовать TidAntifreeze?
h0use (2003-11-26 10:24:00) [46]
А подробней?
Reindeer Moss Eater (2003-11-26 10:18:00) [47]
TidAntifreeze.
Занимается обработкой сообщений во время синхронных вызовов.
Reindeer Moss Eater (2003-11-26 10:12:00) [48]
Это "пунктик" такой есть.
Если надо что-то сделать несколько раз, то без таймера ну никак.
А уж если приложение консольное, и таймер некуда "кинуть", то вообще засада, задача для ктн, как минимум.
:)
Digitman (2003-11-26 09:50:00) [49]
> Reindeer Moss Eater
клиент у него "виснет" на первом же блокирующем ReadLn() в обработчике таймера (нахрена там таймер ? ума не приложу)
Digitman (2003-11-26 09:48:00) [50]
> неужели нельзя сделать так чтоб при простое клиент мог работать,
> при этом в любой момент ожидать сообщение от сервера.
в кл.приложении организуй доп.код.поток
пусть в нем происходит коннект к серверу и ожидание сообщений от него
в тоже время осн.код.поток параллельно может заниматься всем чем угодно
Reindeer Moss Eater (2003-11-26 09:44:00) [51]
Какой смысл ты вкладываешь в термины "клиент не работает" "клиент мог работать"?
Он у тебя что, аварийно завершает свой процесс и выгружается из памяти?
h0use (2003-11-26 09:40:00) [52]
Клиент серверу отсылает сообщения в ответ на сообщения от сервера и наоборот. Но в промежутке когда и сревре и клиент ничего не делают, сообщений нет, можно конечно чтоб они занимались "пинг-понгом", но неужели нельзя сделать так чтоб при простое клиент мог работать, при этом в любой момент ожидать сообщение от сервера.
Digitman (2003-11-25 18:17:00) [53]
> У меня сервер реагирует на сообщения от клиента
а где в твоем коде клиент ХОТЬ ЧТО-ЛИБО посылает серверу ?!
> Неужели это нереальная задача для Инди?
при чем здесь инди ? Совершенно ни при чем ! Это лишь - одна из оболочек транспортного механизма, не более того
h0use (2003-11-25 17:52:00) [54]
Неужели это нереальная задача для Инди?
h0use (2003-11-25 17:36:00) [55]
У меня сервер реагирует на сообщения от клиента и в соотв. процедурах ему отправляет что-то. Например нужно сделать как чат, как только один пользователь послал мессагу, сервре ее перенаправил другому пользователю, поэтому у меня и сервер слушает и клиент.
Digitman (2003-11-25 17:33:00) [56]
а где утебя сервер что-то "думает", а потом "отправляет" ?
я вот вижу, что первым делом сервер ждет чего-то от клиента
Msg:=AThread.Connection.ReadLn;
а клиент в это же время ждет чего-то от сервера
Msg:=TCPClient.ReadLn(#10,50)
)))
и тишина гробовая стоит поэтому)
h0use (2003-11-25 17:22:00) [57]
А как сделать так чтоб клиент не вис, пока сервер думает что ему(клиенту) отправить?
Digitman (2003-11-25 17:20:00) [58]
из кода совершенно непонятно, кто из них, в соответствии с твоим протоколом инф.обмена, первый должен "говорить", а кто "слушать"
оба сразу "слушают" и ждут неизвестно чего