Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2011, 20:16   #1
MoBLer
Пользователь
 
Аватар для MoBLer
 
Регистрация: 30.12.2010
Сообщений: 91
Сообщение совет по работе с ServerSocket и ClientSocket

Здравствуйте , прошу у вас совета(вопрос). Есть сервер и клиент, когда клиент подключается к серверу, он клиенту отправляет изображение и клиент его показывает. А если сразу 2 или 3 клиента подключаются изображение все получат учитывая скорость передачи? Если нет то как организовать передачу файла всем клиентам.
Вложения
Тип файла: rar socket.rar (31.3 Кб, 16 просмотров)
Я тебе помог, добавь отзыв)))))
Статьи по программированию
MoBLer вне форума Ответить с цитированием
Старый 06.05.2011, 21:24   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Это вообще не будет работать в условиях нахождения клиента и сервера на разных хостах, и уж тем более по разные стороны маршрутизатора.
mss вне форума Ответить с цитированием
Старый 06.05.2011, 22:50   #3
MoBLer
Пользователь
 
Аватар для MoBLer
 
Регистрация: 30.12.2010
Сообщений: 91
По умолчанию

Почему? Тогда как надо пересылать файлы? Если можно с примером
Я тебе помог, добавь отзыв)))))
Статьи по программированию
MoBLer вне форума Ответить с цитированием
Старый 06.05.2011, 23:52   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Почему?
Потому что внутренний буфер передачи сокета имеет сравнительно малый и фиксированный размер, по умолчанию равный 8192 байт. Этот буфер безусловно используется в случае когда приемник отправляемого инф.сообщения находится на другом сетевом хосте, отличном от хоста-передатчика.
В этих условиях бесполезно и бессмысленно пытаться выполнить SendBuf(), в расчете за один вызов этого метода отправить данные размером более размера буфера.
Различных решений минимум три:
1. "Дробить" сообщение на "куски" размерами, не превышающими размер буфера передачи, и отправлять последовательно кусок за куском, контролируя результат отправки каждого куска (SendBuf - это функциональный метод)
2. Воспользоваться методом SendStream, неявно реализующим п.1
3. Отказаться от неблок.режима в пользу блокирующего (со всеми вытекающими его преимуществами и недостатками) - в этом случае буферизацию всего отправляемого инф.сообщения берет на себя ОС.
mss вне форума Ответить с цитированием
Старый 07.05.2011, 15:03   #5
MoBLer
Пользователь
 
Аватар для MoBLer
 
Регистрация: 30.12.2010
Сообщений: 91
Хорошо

Цитата:
1. "Дробить" сообщение на "куски" размерами, не превышающими размер буфера передачи, и отправлять последовательно кусок за куском, контролируя результат отправки каждого куска (SendBuf - это функциональный метод)
Алгоритм понятен.
Цитата:
2. Воспользоваться методом SendStream, неявно реализующим п.1
Вот нашел
Код:
{Посылка файла через сокет}
procedure SendFileBySocket(filename: string);
          var srcfile: TFileStream;
begin
  {Открываем файл filename}
  srcfile := TFileStream.Create(filename, fmOpenRead);
  {Посылаем его первому подключенному клиенту}
  ServerSocket1.Socket.Connections[0].SendStream(srcfile);
  {Закрываем файл}
  srcfile.Free;
end;

{Прием файла через сокет}
procedure TForm1.ClientSocket1Read(Sender: TObject;
          Socket: TCustomWinSocket);
var
  l: Integer;
  buf: PChar;
  src: TFileStream;
begin
  {Записываем в l размер полученного блока}
  l := Socket.ReceiveLength;
  {Заказываем память для буфера}
  GetMem(buf,l+1);
  {Записываем в буфер полученный блок}
  Socket.ReceiveBuf(buf,l);
  {Открываем временный файл для записи}
  src := TFileStream.Create('myfile.tmp',fmOpenReadWrite);
  {Ставим позицию в конец файла}
  src.Seek(0,soFromEnd);
  {Записываем буфер в файл}
  src.WriteBuffer(buf,l);
  {Закрываем файл}
  src.Free;
  {Освобождаем память}
  FreeMem(buf);
end;
Будит ли этот пример работать через интернет?


Цитата:
3. Отказаться от неблок.режима в пользу блокирующего (со всеми вытекающими его преимуществами и недостатками) - в этом случае буферизацию всего отправляемого инф.сообщения берет на себя ОС.
Тут тоже вроде понял. но только какие компоненты ипользовать?(это так, для общего развития)
Я тебе помог, добавь отзыв)))))
Статьи по программированию
MoBLer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ClientSocket и ServerSocket. Vaigard Работа с сетью в Delphi 7 19.02.2011 08:56
serversocket-clientsocket ben95 Работа с сетью в Delphi 10 20.01.2011 08:28
ClientSocket и ServerSocket KoBRaAndrey Работа с сетью в Delphi 4 08.01.2010 19:21
ServerSocket и ClientSocket Sensizu Работа с сетью в Delphi 5 30.12.2009 00:09
ClientSocket и ServerSocket Blood o men Работа с сетью в Delphi 2 25.11.2009 11:36