Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.02.2011, 09:27
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Восклицание вопрос по поводу ServerSocket и ClientSocket'ов

Здравствуйте, у меня такой вопрос:
я пишу приложение по типу клиенты<->сервер, использую компоненты TServerSocket и TClientSocket. Каждый клиент подсоединяется к серверу и присылает ему какие-то данные, структуры(небольшого объема, >100 байт), когда сервер получил данные от клиента, он их должен передать в точно таком же виде всем другим клиентам. Вопрос в том, а правильно ли я реализую это ?
P.S. ServerType:=stNonBlocking;
Вот как делаю я:
Код:
  procedure TForm1.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
 var
 Buf:Struct;
 i:integer;
 begin
  Socket.ReceiveBuf(Buf,SizeOf(Buf)); 
  for i := 0 to Server.Socket.ActiveConnections - 1 do
   if Server.Socket.Connections[i].RemoteAddress<> Socket.RemoteAddress then 
 Server.Socket.Connections[i].SendBuf(Buf,SizeOf(Buf));
end;
__________
Меня здесь волнует то, что если например одновременно придет несколько сообщений от разных клиентов правильно ли их обработает сервер и отошлет другим клиентам нужные сообщения, всё ли обработает, всё ли отошлет ?
Пойдет ли такая реализация клиентов/сервера или нужно как-то создавать потоки, что если от одного клиента пришло сообщение, то сервер отправляет это сообщение уже не из этой процедуры, а с другого потока ? И если это нужно именно так, то подскажите пожалуйста, как это должно выглядеть.
P.S. Клиентов много не рассчитывается, где-то в районе 2-10.
__________________
Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей
Ответить с цитированием
  #2  
Старый 16.02.2011, 09:52
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

я бы так сделал рассылку по клиентам:
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  len: Integer;
  buf: PChar;
  i: Integer;
begin
  len:=Socket.ReceiveLength;
  buf:=GetMemory(len);
  try
    len:=Socket.ReceiveBuf(buf^, len);
    for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
      if Socket<>ServerSocket1.Socket.Connections[i] then
        ServerSocket1.Socket.Connections[i].SendBuf(buf^, len);
  finally
    FreeMemory(buf);
  end;
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 16.02.2011, 10:02
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Сообщение Возможно

Да, неплохой вариант пересылки по клиентам, мне нравится тоже.
Но вопрос ещё в силе, ответ-то не получил я..
__________________
Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей
Ответить с цитированием
  #4  
Старый 16.02.2011, 10:57
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну если все правильно сделать, то все будет Окау. вот можно поиграться:
http://data.cod.ru/89412
Open - "включает" сервер
Create - создает 10 клиентов и подключает их
SendText - 3 из них посылают сообщения со своим номером
в Memo будет рассылка для 10 клиентов. и что правильно, 3 клиента получат рассылку от 2-х, т.е. от самих себя не получат.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 16.02.2011, 11:21
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Радость Спасибо

Спасибо, надеюсь, что всё будет работать нормально. Просто хотел знать точно, чтобы потом не пришлось переделывать, если вдруг сейчас что-то неправильно начал делать в области сервера.
__________________
Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:04.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025