![]() |
Модераторы: Snowy, Poseidon, MetalFan |
![]() ![]() ![]() |
|
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
Я бы записывал и считывал в TStream... Что-то типа
ну а на клиенте - наоборот, только надо не забыть после считывания длины строки сделать ей SetLength |
||||
|
|||||
Vlarim |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 21.8.2011 Репутация: нет Всего: нет |
Что то не пошло...
Ошибка external exception c000001E Сейчас изучаю TStream, раньше не приходилось с этим работать. Это сообщение отредактировал(а) Vlarim - 24.3.2014, 12:09 |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
1. объект Data не инициализирован
2. содержимое строки начинается с индекса [1]. Код для записи я привел. Добавлено @ 12:24 ПыСы. Очень полезно читать, что Delphi пишет в Hints и Warnings при компиляции. В идеале - их вообще не должно быть. Это сообщение отредактировал(а) kami - 24.3.2014, 12:24 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 2 Всего: 459 |
Если что вдруг, у нас есть свой маленький ликбез на тему стримов http://forum.vingrad.ru/articles/topic-211911.html -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Vlarim |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 21.8.2011 Репутация: нет Всего: нет |
Спасибо за ссылку, правда я уже на раз 7 прочитал и из гугла страниц 40.
TStream - абстрактный, необходимо создавать наследника. Берем TMemoryStream, т.е. добавляем строку Data:= TMemoryStream.Create;?
В итоге получилось:
Правда еще на практике не проверял, дома нет Delphi (т.е. исходников) Это сообщение отредактировал(а) Vlarim - 24.3.2014, 16:02 |
||||||||
|
|||||||||
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
Почитал справку про короткие строки (давненько не приходилось с ними работать) - код надо переписать...
Во-первых, короткие строки содержат по байту на символ, посему Length*SizeOf(Char) - не актуально и приведет к порче памяти, надо просто Length. Во-вторых, короткие строки сразу получают в свое распоряжение столько памяти, сколько могут занять + 1 байт на длину, в нашем случае получится 11 байт. То есть - Length тоже не надо ![]() Итого получаем на передачу:
... ну и на прием, соответственно -
Вот как-то так... Добавлено через 1 минуту и 23 секунды имелись ввиду юникодные версии Delphi Добавлено через 2 минуты и 56 секунд ЗЫ. И от такой красоты хотят избавиться, оставив в Delphi только один строковый тип... |
||||
|
|||||
Vlarim |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 21.8.2011 Репутация: нет Всего: нет |
Спасибо за ответы.
Пересобрал сервер и клиент. Сейчас поставил на тест. Осталось прикрутить что то вроде onConnect и Client IP. Это сообщение отредактировал(а) Vlarim - 25.3.2014, 09:37 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 2 Всего: 459 |
Мне казалось, что тут как раз смысл стримов в том, чтобы снять необходимость в использовании строк фиксированной длинны. Т.е. если мы записываем поля по одному, а не всю запись целиком, то строка уже может быть указателем, ведь уже нет необходимости чтобы в памяти поля шли одно за другим непрерывно. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
В общем случае - абсолютно согласен. Но если поля достаточно мелкие по размеру и ограничения заданы высшими силами (к примеру - поля VARCHAR(10) в БД), то получается очень компактная и, имхо, красивая&понятная запись. Добавлено через 3 минуты и 18 секунд Хотя, да - если не знать структуру TData, да еще не помнить особенности ShortString (как, например, в моем случае) - то подобный код сразу вызывает опасения ![]() |
|||
|
||||
Vlarim |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 21.8.2011 Репутация: нет Всего: нет |
Ну думаю дальше тестировать нет смысла.
Уже понятно, что программа стабильно работает на протяжении почти недели. Поэтому вопрос считаю решенным. Но могу добавить: - В интернете описан только один метод работы (один сервер)<->(много клиентов). Может конечно плохо искал, но искал долго и упорно. Данный метод я реализовал в своей программе и пол года мучался. - Метод предоставленный kami, отлично справляется со своей задачей. (не знаю как насчет недостатков, но побочный эффект есть - если перезапустить сервер, то соединения не рвуться) - Немного разобрался с потоками и TStream. Всем ОГРОМНОЕ СПАСИБО!!! |
|||
|
||||
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
Вообще-то я давал код исключительно для того, чтобы кусок из него можно было адаптировать под stBlocking-режим, дабы не происходило дедлоков. ![]()
А какие хотелось бы? Клиент физически не в состоянии открыть несколько соединений, как бы этого ни хотелось. Можно создать много клиентов, положить их в один контейнер и обращаться с ними, как с группой. Но от этого "много клиентов, каждый из которых установил одно соединение" они ни во что другое не превратятся ![]() Добавлено через 3 минуты и 11 секунд
Есть утечки памяти. Сейчас не вспомню, где, но есть. Надо в приложение FastMM включить в режиме FullDebugMode и они все вылезут. Одно только помню - если соединения нет, а клиент постоянно что-то пытается отправить, то будет Out of memory, т.к. переполнится внутренний буфер. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: Сети" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |