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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2010, 11:50   #581
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

1. Как тогда быть в моём случае? Вот мой код
Код:
procedure TFormMain.ConnectTimerTimer(Sender: TObject);
begin
  ClientSocket.Active := True;
end;
...
procedure TFormMain.ClException(Sender: TObject; Error: Exception);
begin
  if (Error.ClassName = 'ESocketError') then
    begin
      // Снова пытаемся подключиться через таймер 1 раз в 5 секунд
      StatusBar1.Panels[1].Text := '';
      StatusBar1.Panels[2].Text := 'Ожидание подключения к серверу...';
      UserListView.Clear;

      ClientSocket.Socket.SendText('0'); // Это вызовет ошибку сокета на стороне клиента
      ConnectTimer.Enabled := True;
    end
    else
      Application.ShowException(Error); // Ошибки не сокета пусть показывает
end;
...
ConnectToChat // Процедура подключения к чату.
// Вызывается в собитии FormCreate формы настроек, если введён ник или через кнопку OK всё в той же форме настроек.
...
procedure TFormMain.ConnectToChat;
begin
  // Запишем указанный порт в ClientSocket
  ClientSocket.Port := StrToInt(ChatPort);

  // Запишем хост и адрес (одно значение ChatHost в оба)
  ClientSocket.Host := ChatHost;
  ClientSocket.Address := ChatHost;

  // Запускаем клиента
  ConnectTimer.Enabled := True;
  // Изменяем тэг
  ChatConnectStatus := True;
end;
2. Чем может быть вызвано на сервере неправильное формирование списка юзеров или это клиент сбой дал?
Изображения
Тип файла: jpg Ошибка.jpg (33.5 Кб, 125 просмотров)

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

На сервере не должно быть ConnectTimer, его процедуры. Обработка ошибок сервера видоизменяется:

Код:
procedure TFormMain.ClException(Sender: TObject; Error: Exception);
begin
  if (Error.ClassName <> 'ESocketError') then Application.ShowException(Error); // Ошибки не сокета пусть показывает
end;
ConnectToChat на сервере не нужна.

Как для клиент уже показал выше.

Цитата:
2. Чем может быть вызвано на сервере неправильное формирование списка юзеров или это клиент сбой дал?
Может быть где угодно, смотрите обработку пакета авторизации и все коды, связанные с обработкой ников, следите за длиной информативной части: пакет - системный код = ник
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 30.08.2010, 18:39   #583
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Прошу прощения, что сразу не написал, что код показал из клиентской части.
Не могу код применить, так как кнопки ClientBtn больше нет, по этому я и спросил как быть в моём случае на клиенте, показав код, но не сказав, что он с клиента.
Shouldercannon вне форума Ответить с цитированием
Старый 30.08.2010, 18:58   #584
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

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

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Должна быть хоть какая-то кнопка, которая позволяет подключаться и отключаться не закрывая клиентское приложение. На эту кнопку нужно все настроить.
К сожалению такой нет, вместо кнопки процедура ConnectToChat

Вот как выглядит на данный момент событие ClientError на сервере
Код:
procedure TFormMain.ServerSocketClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  UpdMas := True;
end;
Shouldercannon вне форума Ответить с цитированием
Старый 31.08.2010, 17:55   #586
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

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

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

ClientError событие можно и такое, ...пусть опрашивает всех.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 02.09.2010, 13:59   #587
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Решил сделать передачу файлов и ознакомился с #312 и возникли вопросы и трудности.
1. В какой момент на сервере высвобождать NetFile: TMemoryStream?
2.
Цитата:
// по условию передачи полного размера (нужно до файла слать параметры, среди которых длина файла) выполняется сохранение файла
Тоесть эти данные сначала надо получить, а потом отослать на сервер как текст?
3. Пытался передать архив размером 2.8 Gb в результате чего
Out of memory while expanding memory stream.
ServerSocket.Socket.Connections[i].SendStream(NetFile);
Сокеты не могут передавать файлы очень больших размеров?
4. Пытался передать текстовый файл размером 59 Kb, но случилась снова ошибка
List index out of bounds (1).
Видимо выбран не существующий канал.
Shouldercannon вне форума Ответить с цитированием
Старый 08.09.2010, 23:07   #588
Ckomoroh
Я еще только учусь
Форумчанин
 
Аватар для Ckomoroh
 
Регистрация: 24.10.2009
Сообщений: 125
По умолчанию

Отпраляю буфер с клиента в таймере, по событию нажатия кнопки. Но только почему-то на сервере выскакивает ошибка -
'[]' is not a valid integer. ([] - это такой кракозябный прямоугольник).
Это значит, что он принимает не числовые переменные? Но в процедуре то я посылаю массив.
Код во вложении.
Вложения
Тип файла: rar 1.rar (448.3 Кб, 26 просмотров)
Ckomoroh вне форума Ответить с цитированием
Старый 12.09.2010, 23:49   #589
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

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

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

Напишите сюда, ...посмотрим ход мысли.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 13.09.2010, 18:15   #590
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Ckomoroh, нельзя пользоваться параллельно двумя таймерами на проверку содержимого входящего пакета. Даже если с клиента отправлен массив, основной таймер все равно начинает обрабатывать его, длина-то существует. Первая же проверка на тип команды вызывает исключение, поскольку взяв пакет как текст командой Copy невозможно переделать в число (StrToInt) символ, который числом по коду не является. Все значения массива в текстовой форме с кодом, не входящим в диапазон 48 - 57, не могут быть представлены числами, от сюда и "is not a valid integer" - символ не может быть представлен числом.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 13.09.2010 в 18:17.
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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