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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2010, 20:22   #1
SwiP
Форумчанин
 
Регистрация: 18.03.2009
Сообщений: 101
Восклицание Socket.SendText проблема

Проблема в том, что мне надо при подсоединении клиента отправить ему элементы ListBox'a. Решил организовать на стороне сервера цикл типа
Код:
ServerSocket.Socket.Connections[0].SendText(IntToStr(Listbox.Items.Capacity)); //Количество элементов

for i:=0 to Listbox.items.capacity-1 do
ServerSocket.Socket.Connections[0].SendText(Listbox.Items[i]);
То есть в начале я отправляю количество элементов (чтобы на стороне клиента было известно количество элементов), а потом по одному отправлять строки листбокса.


Вот код на стороне клиента:
Код:
n:=StrToInt(Socket.ReceiveText); // Первым делом узнаём количество элементов

  for i:=0 to n-1 do
    Listbox.Items.Add(Socket.ReceiveText);
Но в итоге получается полная каша. Всё это приходит за один раз. То есть цикл просто берёт, сначала складывает все строки воедино и потом её отправляет (одну).

Например, у нас есть листбокс, и в нём 3 строки.
Тогда придёт вот такое:
Код:
3перваястрокавтораястрокатретьястрока
Хотелось бы узнать, как сделать по человечески?

Последний раз редактировалось SwiP; 25.05.2010 в 23:49.
SwiP вне форума Ответить с цитированием
Старый 25.05.2010, 20:48   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это делает не цикл а винда, так как формируется изначально буфер, потом он отправляется, вам нужно чтото типа пакетов. в которые уже упаковывать свои данные, ну или как то иначе строки разделять.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.05.2010, 20:50   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

по человечески, это сформировать пакет типа запись и посылать его, и такую-же структуру иметь для расшифровки на другой стороне, только посылать буфер или потоком, а не текстом... например:
Код:
type packet= record
 kol: integer;
 odin_stroka: string [10];
 dva_stroka: string [10];
 tri_stroka: string [10];
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 25.05.2010, 21:57   #4
SwiP
Форумчанин
 
Регистрация: 18.03.2009
Сообщений: 101
По умолчанию

буфером не годится, а потоком это как?
SwiP вне форума Ответить с цитированием
Старый 25.05.2010, 23:47   #5
SwiP
Форумчанин
 
Регистрация: 18.03.2009
Сообщений: 101
По умолчанию

Кстати, а в делфи нету аналога хорошей такой функции explode/implode в РНР? Она склеивала строки через специальный разделитель, и потом с помощью разделителя их разделяла?
SwiP вне форума Ответить с цитированием
Старый 26.05.2010, 00:59   #6
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Цитата:
а потоком это как?
Объявляете переменную к примеру TMemoryStream. Записываете в неё нужные данные и потом отправляете. Принятые данные записываете так же в поток памяти и потом извлекаете данные.
Код:
ClientSocket1.Socket.SendStream()
Цитата:
Кстати, а в делфи нету аналога хорошей такой функции explode/implode в РНР? Она склеивала строки через специальный разделитель, и потом с помощью разделителя их разделяла?
В Делфи не встречал такой функции. Можете написать сами или допустим после каждой строки добавлять какой-нибудь символ и потом по нему и разделять назад данные.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 26.05.2010, 01:08   #7
SwiP
Форумчанин
 
Регистрация: 18.03.2009
Сообщений: 101
По умолчанию

Код:
ClientSocket1.Socket.SendStream()
А там не будет такой же неприятной вышеописанной ситуации, когда всё будет склеиватся в одно?
Если будет, то буду писать свою разделялку
SwiP вне форума Ответить с цитированием
Старый 26.05.2010, 01:31   #8
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Цитата:
А там не будет такой же неприятной вышеописанной ситуации, когда всё будет склеиватся в одно?
Если всё делать правильно, то не будет.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 26.05.2010, 19:46   #9
SwiP
Форумчанин
 
Регистрация: 18.03.2009
Сообщений: 101
По умолчанию

Нашёл более лёгкий и удобный способ, можно ведь просто сделать так:
Socket.SendText(ListBox.Items.Text) , тут он сам разделяет элементы, а у клиента сам собирает
Но вот ещё проблема небольшая: Не получается послать через сокет текст при дисконнекте клиента. Мне нужно послать ID клиента, когда он уходит, чтобы на сервере можно было удалить его имя из листбоксаю
Мне попросту ничего не приходит:

Код на стороне клиента:
Код:
ClientSocketDisConnect

ClientSocket.Socket.SendText(id);
На сервере:
Код:
ServerSocketClientDisConnect

 t:=Socket.ReceiveText;
  ShowMessage ('Клиент отключён! #'+t); // Где t - это должен быть присланный ID
SwiP вне форума Ответить с цитированием
Старый 26.05.2010, 22:15   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Код на стороне клиента
ракируйте

...а это
Цитата:
Socket.SendText(ListBox.Items.Text) , тут он сам разделяет элементы, а у клиента сам собирает
свойство stringlist-а, тот же пакет.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ClientSocket/Serversocket SendText Lime Работа с сетью в Delphi 10 08.10.2009 19:52
Socket Djem1991 Работа с сетью в Delphi 6 03.07.2009 23:45
socket Артэс C/C++ Сетевое программирование 2 22.06.2009 17:22
SoCket и списки Demol Работа с сетью в Delphi 2 22.03.2009 18:16
Socket Get Editor Работа с сетью в Delphi 7 22.04.2008 05:48