SendData в цикле

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

SendData в цикле

Сообщение XairOn » 08.10.2004 (Пт) 19:16

И снова здравствуйте, у меня теперь такой вопрос: можно ли отправлять данные методом WinSock.SendData в цикле, например:

Код: Выделить всё
For i = 0 To 10
tcpServer.SendData List1.List(i)
Next i


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

Код: Выделить всё
For i = 0 To 10
tcpServer.GetData text
list1.AddItem text
Next i


если я таким образом пытаюсь сделать это, то получается, что у меня передается сразу все содержимое листбокса, (при i=0) а потом 10 раз пустые строки, можно ли вообще так делать (в цикле отправлять и принимать данные). Просто если содержимое листбокса "очень" велико (примерно 400 строк и больше), одной переменной не получается передать всё содержимое, клиентский листбокс получается каким-то обрезанным, поэтому я и решил передавать каждую строку по очереди...или есть другое решение этой проблемы??? :-( Помогите пожалуйста!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.10.2004 (Пт) 19:26

Передавать данные в цикле - можно, но чтобы они не "склеивались" при передаче, нужно их чем-то разделять, например vbNullChar, а при приёме по этому разделителю резать обратно.
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 09.10.2004 (Сб) 7:20

vbNullChar...хм, ну при чем тут цикл? Если я правильно тебя понял, то клиент все равно будет получать одну строку, а иначе
зачем же ещё разделитьель нужен? Мне ведь нужно, чтобы каждая строка из листбокса по очереди отправлялась, а ты предлагаешь
(как я понял) в одной переменной всё передать, а потом нарезать опять же на строки, сначала я так и делал, но проблема в том,
что при большом количестве Item'ов они не все доходят, строка "обрезается". Не мог бы ты хотя бы маленький пример привести,
а то я что-то не совсем понимаю.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.10.2004 (Сб) 14:13

XairOn, винсок шлёт не "переменные", а поток данных. Иногда - на самом деле редко - в один поток попадает ровно одна переменная. А вообще, посланные переменные могут по дороге дробиться, а у клиента склеиваться незаметно для тебя.
Поэтому единственный выход - установить собственный контроль за пересылаемыми данными. Как вариант - разделять все строки vbNullChar, если есть гарантия, что внутри строк он не встретится.
Пример из головы (не проверял):
Код: Выделить всё
'сервер
Dim i As Long
For i = 0 To List1.ListCount
    Winsock1.SendData List1.List(i) & vbNullChar
Next


'клиент
Dim Buffer As String
Sub Winsock1_DataArrival
Dim Subbuffer As String, Chunks As Variant, i As Long
    Winsock1.GetData Subbuffer
    Buffer = Buffer & Subbuffer
    Chunks = Split(Buffer, vbNullChar)
    For i = 0 To UBound(Chunks) - 1
        List1.AddItem Chunks(i)
        Buffer = Mid$(Buffer, Len(Chunks(i)) + 1)
    Next
End Sub
Изображение

-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Сообщение -=TsA=- » 11.10.2004 (Пн) 8:27

Была у меня подобная проблема решил ее так:
1. Завел переменную типа Boolean

2. Проверяю переменную если True то посылаю пакет, и выставляю переменную в False, иначе пропускаю посылку пакета.

3. На клиенте по окончанию приема пакета отправляю на сервер сообщение "Ок".

4. На сервере по приеме сообщения "Ок" выставляю переменную в True далее см. п. 2.

так я гарантированно получал ровно столько сколько нужно
Последний раз редактировалось -=TsA=- 11.10.2004 (Пн) 10:23, всего редактировалось 1 раз.

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 11.10.2004 (Пн) 8:41

На мой взгляд есть два варианта:
1 - склеить данные из listbox в одну строку ч/з разделитель и передать одной строкой.
2 - как предложено выше разработать свою систему комманд (что-то вроде протокола верхнего уровня).
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2004 (Пн) 13:49

kif писал(а):На мой взгляд есть два варианта:
1 - склеить данные из listbox в одну строку ч/з разделитель и передать одной строкой.
2 - как предложено выше разработать свою систему комманд (что-то вроде протокола верхнего уровня).

Вариант 1 - гарантированно быстрее при ничуть не меньшей надёжности.
При этом не обязательно явно всё склеивать в одну строку, достаточно послать строки одну за другой.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.10.2004 (Пн) 13:52

Вопрос только в разделителе, ибо и vbNullChar не панацея. Советовал бы использовать не разделитель, а префикс, указывающий длину последующего потока данных.
Lasciate ogni speranza, voi ch'entrate.

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 11.10.2004 (Пн) 14:04

вопрос еще и в типе данных
допустим если передаются данные типа фио, адрес, www, email и т.д., то можно перед непосредственными данными втавлять соответствующий префикс - fio, adr, www, eml и т.д.

При приеме разобрать строку.

Вот и все.
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 11.10.2004 (Пн) 14:05

Это к тому, что в данном случае не требуется разделитель как таковой.
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2004 (Пн) 14:08

А если в email встретится строка "www", или наоборот, то что - всё сломается?
Изображение

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 11.10.2004 (Пн) 14:33

tyomitch ты меня не понял.

Это просто условность.

Префиксы можно придумать такие, чтобы не было никаких исключений, даже на русском языке или с использованием цифр - параметр01, параметр02 и т.д.
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.10.2004 (Пн) 15:25

Да уж :)
47-килобайтный префикс для 40-символьной строки :)
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 1

    TopList  
cron