Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Клиент серверное приложение. Одновременная работа?


Автор: WaReZMEN 19.8.2008, 03:44
Делаю на IdTCPServer и IdTCPClient
Так вот с одним пользователем все понятно и все отлично работает... как реализовать работу с несколькими пользователями одновременно? То есть хочу от них получать потоки по запросу отправлять им патоки ну или скажем только некоторым из низ отправлять потоки. Подскажите плиз как сделать????
 smile 

Автор: Matematik 19.8.2008, 07:54
http://www.indyproject.org/Sockets/Demos/index.EN.aspx
Скачай Indy 9 Demo, там есть пример чата на IdTCPServer

Автор: WaReZMEN 19.8.2008, 08:05
Matematik, Чат не то что мне нужно у меня там беспрерывный (почти) идет обмен файлами от 10кб до 2 метров. Да и к томуже нужно под Indy 10

Автор: Snowy 19.8.2008, 11:59
Цитата(WaReZMEN @  19.8.2008,  03:44 Найти цитируемый пост)
Так вот с одним пользователем все понятно и все отлично работает... как реализовать работу с несколькими
ТIdTCPServer - это сервер. Многопоточный. Обслуживает N подключений одновременно. На каждое подключение создаёт свой тред.
Так в чём тогда вопрос? Не понятно...
Если только ты не забиндил клиентский порт.
Тогда не сможет несколько обслуживать - порт занят.

Автор: WaReZMEN 19.8.2008, 13:04
Snowy, к примеру у TIdTCPServer в execute принемается информация от клиента отправляется ему ответ. так вот не совсем понятно как определить что иммено нужному клиенту отправляется то что нужно... еслиб был маленький пример былоб проще понять если нужно могу выложить исходник сервера...

Автор: Snowy 19.8.2008, 13:31
На нижнем уровне TCP/IP клиентов ты можешь различать только по IP/Port
Если нужно различать по логину/паролю или пр., то нужно разрабатывать протокол.
Собственно ни один обмен данными не обходится без протокола. Собственного или существующего.
Так вот, как тыбудешь различать клиентов, это уже вопрос к тебе.
Что в твоём понимании клиент - зависит от твоих целей.
Вся нужная информация о соединении тебе передаётся в Context.
В свойстве Socket можешь узнать хост и порты.
Также есть свойство Data, которое ты можешь использовать для своих нужд. Например для связки соединение-клиент, или для указания на любой объект, переменную и т.д. Зависит от целей.

Вобщем для решения задачи все средства есть. А вот твоя задача - сформулировать задачу, и только потом реализовать.
А пока совершенно не понятно, что ты хочешь.
Сформулируй задачу. Напиши план. Определись с понятиями. Создай постановку и распиши протокол обмена.

Автор: WaReZMEN 20.8.2008, 00:06
Snowy, 
Цитата(Snowy @  19.8.2008,  21:31 Найти цитируемый пост)
можешь различать только по IP/Port

Ну порт то у всех один и тотже... да и IP не у никальный скажем если пару компов через одну прокси сидят то и соответствено внешний IP у них одинаковый.
Что есть: 
Код

var
   MStream: TMemoryStream;
....
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  Len:String;
begin
     len:=AContext.Connection.IOHandler.ReadLn;
     AContext.Connection.IOHandler.ReadStream(MStream, StrToInt(Len), FALSE);
     MStream.Position:=0;
     Memo1.Lines.LoadFromStream(MStream);

     Memo1.Lines.Add(AContext.Connection.IOHandler.ReadLn);
     
     AContext.Connection.IOHandler.WriteLn('OK');
end;

в IdTCPServer1Execute выполняется получения файла и отправляется ответ клиенту каторый подконекчен. Если клиентов будет больше одного то не понятно как тут что произоидет? 
Хочется Сделать пару кнопок на серверен при на жатий на каторые отправлялись команды на запрос файла от клиента. Но сдесь становится не понятно как я отправлю имеено тому клиенту каторому нужно. в приеме у меня  есть AContext.Connection.IOHandler и я отправляю ответ тому каму кто законекчен а если делать отдельной кнопкои становится не ясно как это сделать...  smile 

Еще вопросик:
Ситуация когда клиент запущен а сервер нет у меня в клиенте есть таимер он каждые 5 секунд пытается подключится к серверу
Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    IdTCPClient1.ConnectTimeout:=1;
    try
      if NOt IdTCPClient1.Connected then  IdTCPClient1.Connect
    except
    end;
end;

Но это все шутко замедляет работу клиента... а хотелось бы чтоб клиент продолжал рабоать буддто ничего не происходит... smile  

Автор: Snowy 20.8.2008, 14:17
Цитата(WaReZMEN @  20.8.2008,  00:06 Найти цитируемый пост)
Ну порт то у всех один и тотже...
Это с какого такого перепугу?
Какой порт на той стороне - это не тебе решать. Ты определяешь только порт сервера.

Цитата(WaReZMEN @  20.8.2008,  00:06 Найти цитируемый пост)
да и IP не у никальный
IP нет. А вот пара IP/Port - да.

Цитата(WaReZMEN @  20.8.2008,  00:06 Найти цитируемый пост)
Если клиентов будет больше одного то не понятно как тут что произоидет? 
Фигня полная произойдёт. Нарушение совместного доступа. И, в лучшем случае, просто не будет работать. В худшем, навернётся твой сервер нафиг.
Сервер - многопоточное приложение. А многопоточность требует крайней аккуратности и распределения.
1. Ну нафига тебе глобальный MemoryStream? Либо делай локальный для каждого треда, либо глобальный блок памяти, например массив. А мемористрим тут совсем не годится - его каждый тред модифицировать будет.
2. При одновременном достуме, изменяющем данные, нужно делать синхронизацию между тредами.


Цитата(WaReZMEN @  20.8.2008,  00:06 Найти цитируемый пост)
 и я отправляю ответ тому каму кто законекчен а если делать отдельной кнопкои становится не ясно как это сделать...
Ну ты же сервер. Ты можешь отправить только тем, кто законекчен.
Если ты осуществляешь подключение, то ты уже не сервер, а клиент.

Автор: WaReZMEN 20.8.2008, 14:25
Snowy, а с этим что посоветуете?

Цитата(WaReZMEN @  20.8.2008,  08:06 Найти цитируемый пост)
Ситуация когда клиент запущен а сервер нет у меня в клиенте есть таимер он каждые 5 секунд пытается подключится к серверу

Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    IdTCPClient1.ConnectTimeout:=1;
    try
      if NOt IdTCPClient1.Connected then  IdTCPClient1.Connect
    except
    end;
end;





Но это все жутко замедляет работу клиента... а хотелось бы чтоб клиент продолжал рабоать буддто ничего не происходит...


Автор: Snowy 20.8.2008, 14:30
Антифриз на форму брось

Модератор: Пожалуйста, один топик - один вопрос.

Автор: MetalFan 20.8.2008, 16:23
 smile 
офф: интересно, а во ************ все такие "грамотеи"?

Автор: WaReZMEN 20.8.2008, 23:48
MetalFan, Нет только я один smile. С русский  со школы проблемы вечно куча ошибок...

Snowy, спасибо за помощь! +

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)