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

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

Вернуться   Форум программистов > Клуб программистов > Обсуждение статей
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2010, 00:54   #591
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Shouldercannon, любая передача данных между сервером и клиентом это диалог. Существует диалог на системном уровне сокетов - это та часть которая нам не показана. В каждый момент события есть код, по которому сокеты "понимают" что происходит у каждого из них, в каком режиме они находятся, это что-то в роде переговоров по Си-Би: "передал данные, ...как понял?, ...прием", "данные принимаю, режим чтения, ...следующий пакет" , "отправляю пакет, ...как понял?", "данные принял, ...прием." и т.д.

Программа использует протокол, который вы написали самостоятельно. Это более высокий уровень, сокеты не начнут "общаться" на низком уровне без команд собственного протокола. Нужно четко понимать, что любой режим в программе должен быть структурно описан. Берите листок и пишите по порядку пункты, что происходит шаг за шагом, когда нужно передать файл.

Напишите сюда, ...посмотрим ход мысли.
Вот мой ход мысли отправки файла на сервер, возможно нубский
1. Выбираем получателя
2. Выбираем файл для отправки
3. Получаем данные о файле (имя и размер)
4. Отсылаем на сервер команду на получение файла, в которой содержится: ник получателя, имя файла, размер файла
5. Сервер должен подтвердить команду на принятие файла отослав команду клиенту
6. Клиент приняв команду помещает файл в поток и начиает передачу файла
7. Тоже создаём поток и начнаем принимать файл
8. Завершение принятия файла и высвбождение потоков
Оказывается не так-то и просто. Походу много чего напропуска и много чего не нужного понаписал
P.S. Начать принимать файл после подтверждения юзером на желание приёма

Последний раз редактировалось Shouldercannon; 14.09.2010 в 13:00.
Shouldercannon вне форума Ответить с цитированием
Старый 14.09.2010, 16:12   #592
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

В общем, все так и есть. Техническая сторона требует четкой последовательности. Вот более конкретно (клиент1-сервер-клиент2):

1. Клиент 1 выбирает получателя;
2. Клиент 1 выбирает файл для отправки;
3. Клиент 1 отсылает данные файла на Сервер;
4. Сервер проверяет параметры на существенность;
5. Сервер передает данные файла Клиенту 2, если такой существует в списке;
6. Клиент 2 получает данные о файле (имя и размер), создает поток;
7. Клиент 2 отсылает на Сервер команду готовности получения файла;
8. Сервер проверяет Клиента 2 на подлинность готовности и ожидания принятия файла;
9. Сервер отправляет запрос Клиенту 1 на готовность принятия файла;
10. Клиент 1 создает поток, загружает в него файл и отправляет на Сервер;
11. Сервер принимает поток, по завершении приема сверяет размер;
12. Сервер отправляет поток Клиенту 2;
13. Клиент 2 проверяет размер, отправляет на Сервер подтверждение корректной передачи данных;
14. Клиент 2 приняв поток, сохраняет на диске;
15. Сервер передает подтверждение Клиента 2 об успешной передаче файла Клиенту 1;
16. Клиент 2 освобождает поток;
17. Сервер освобождает поток;
18. Клиент 1 освобождает поток;
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 14.09.2010, 18:41   #593
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Попробую сделать
1.
Код:
UserListView.Selected.Caption;
2. С помощью OpenDialog1
Код:
// Если файл не существует, то вместо размера файла функция вернёт -1
function GetFileSize(FileName: String): Integer;
var
  FS: TFileStream;
begin
  try
    FS := TFileStream.Create(Filename, fmOpenRead);
  except
    Result := -1;
  end;

  if Result <> -1 then
    Result := FS.Size;

  FS.Free;
end;
...
  if OpenDialog1.Execute then
    begin
      Edit1.Text := ExtractFileName(OpenDialog1.FileName);
      Label1.Caption := IntToStr(GetFileSize(Edit1.Text)) + ' байт';
    end;
...
3. // Тип отправка/получение файлов (6).
Код:
ClientSocket.Socket.SendText('60' + Edit1.Text + Chr(140) + Label1.Caption);
4. Не совсем понял
5. ServerTimerTimer
Код:
60: begin
// На подобии поиска приватного пользователя
end;
6. ClientSocketRead
Код:
6: begin // Тип
...
0: begin // Подтип
Обработка '60' + Edit1.Text + Chr(140) + Label1.Caption + создание потока
7.
Код:
ClientSocket.Socket.SendText('61');
8. ServerTimerTimer
Код:
61: begin
// Какаята команда или ещё что-то
end;
9,
Код:
ServerSocket.Socket.Connections[Клиент1].SendText('62');
10. ClientSocketRead
Код:
62: begin
// Создание потока
// Загрузка файла
ServerSocket.Socket.Connections[Сервер].SendStream(NetFile);
end;
11. На какую команду начнётся приём потока и его завершению пока не знаю.
Код:
if Данные размера файла полученный с Клиент 1 = Только что полученный размер принятого файла then что-то
12. ServerSocket.Socket.Connections[Клиент 2].SendStream(NetFile);
13, 14, 15. Придётся обдумывать во время написания
16, 17, 18. Поток.Free;

P.S. Сервер тоже сможет принимать файлы? Уведомление о файле будет в привате?

Последний раз редактировалось Shouldercannon; 14.09.2010 в 22:57.
Shouldercannon вне форума Ответить с цитированием
Старый 15.09.2010, 15:31   #594
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

4. Сервер проверяет параметры на существенность

Что будет, если каким-то образом клиент пришлет параметры файла, длина данных в которых равна нулю? ...или не указана вовсе? ...это и есть проверка на существенность.

11. Сервер принимает поток, по завершении приема сверяет размер

Это все на OnClientRead, после пункта 9 (Сервер отправляет запрос Клиенту 1 на готовность принятия файла; ) сервер должен создать запись и поток должен быть в записи конкретного клиента. Вспоминаем собственный тип TUserList, там можно создать переменную потока. В событии можно связать с таймером части: поток и клиента, через IP-адрес.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 23.09.2010, 21:48   #595
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Радость

Столкнулся с ошибкой при очистке чата у всех юзеров
Client
Код:
procedure TFormMain.PCVMClearChatForAllUsersClick(Sender: TObject);
begin
  if UserListView.Items.Count > 1 then ClientSocket.Socket.SendText('50');
end;
Server
Код:
              // Перезапуск сервера чата
              51: begin
                // Проверка на длину пакета
                // Код команды + подкоманда 2 символа
                if len + 2 > 2 then GoTo L1 // Переход в метку
                else
                begin
                  MMServerOnOff.Click;
                  ServerRestartTimer.Enabled := True;
                end;
              end;
В результате ошибка List index of bounds (число бывает разное даже при постоянном количестве юзеров), в очень редких случаях она не появляется (1 раз при 10 чистках). При локально тестировании такого нет. Даже нет возможности посмотреть где эта ошибка возникает.

Так без ошибок
Код:
              // Перезапуск сервера чата
              51: begin
                // Проверка на длину пакета
                // Код команды + подкоманда 2 символа
                if len + 2 > 2 then GoTo L1 // Переход в метку
                else UpdMas := True;
              end;

Последний раз редактировалось Shouldercannon; 24.09.2010 в 13:51.
Shouldercannon вне форума Ответить с цитированием
Старый 24.09.2010, 15:59   #596
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Еще раз конкретнее, что нужно сделать? ...удалено почистить всем пользователям список UserListView?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 25.09.2010, 00:14   #597
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Всетаки не углядел и написать про очистку. Была проблема с перезапуском сервера чата для обновления списка юзеров. Делал её через таймер, потом просто
Код:
UpdMas := True;
и ошибки не стало.
Shouldercannon вне форума Ответить с цитированием
Старый 26.09.2010, 19:59   #598
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

1. Если кто-то один не отчвчает на команду отправки ника, то всё заступоривается и клиенты не могут получить список. С перезапуском чата по таймеру работало на 100%, но с ошибкой. Похоже помимо
Код:
UpdMas := True;
нужно что-то ещё сделать.

Последний раз редактировалось Shouldercannon; 27.09.2010 в 15:45.
Shouldercannon вне форума Ответить с цитированием
Старый 25.10.2010, 17:25   #599
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Уже несколько раз говорил, что нужно делать, и в ЛС тоже. Заводим счетчик для клиентов на стороне сервера, чтобы сервер считал время для каждого, если по истечении времени нет ответа от конкретного клиента, отключать его, а всем остальным пойдет новый список уже без "зависшего" пользователя. Счетчик начинает считать таймаут сразу после системных запросов сервера, на которые обязательно нужно получать ответ пользователя, ...нет ответа, ...истекло время ожидания, ...ну, и, собственно, "гуляй Вася", отключаем такого пользователя.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 16.11.2010, 01:30   #600
Pypkin30159
Пользователь
 
Регистрация: 03.04.2010
Сообщений: 19
По умолчанию

помогите с кодом вывода сообщения когда программа находится в свернутом состоянии в трее. Если сообщение приходит то вывести его PopUp я пользуюсь библиотекой CoolTrayIcon
Pypkin30159 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обновление в блоге - Создание клиент-сервера Pblog Обсуждение статей 0 03.10.2007 17:12
обновление в блоге - Диплом. Создание и продвижение сайта - готовь сани летом, а дипл Pblog Обсуждение статей 0 31.08.2007 20:00
обновление в блоге - USB Холодильник Pblog Обсуждение статей 0 25.06.2007 14:13
обновление в блоге - О ярлыках Pblog Обсуждение статей 0 27.05.2007 03:17