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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2007, 20:30   #1
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
Печаль Работа с ServerSocket и ClientSocket

Доброго времени суток.
На сервере в StringGrid'e находится список файлов доступных для копирования. По OnClientConnect клиенту передается этот список, вот так:

Код:
i:=1;
while StringGrid1.Cells[0,i]<>'' do
Begin
ServerSocket1.Socket.Connections[0].SendText(StringGrid1.Cells[0,i]);
i:=i+1;
End;
Клиент через OnRead получает данные и должен вставить в свой StringGrid построчно:

Код:
Str:=ClientSocket1.Socket.ReceiveText;
StringGrid1.Cells[0,i]:=Str;
Но все переданные строки приходят в виде одной но длинной :-(. Помогите кто чем может.
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"

Последний раз редактировалось AlDelta; 26.09.2007 в 21:04.
AlDelta вне форума Ответить с цитированием
Старый 26.09.2007, 20:48   #2
Рустам
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 260
По умолчанию

Цитата:
Сообщение от AlDelta Посмотреть сообщение
Но все строки переданные строки приходят в виде одной но длинной
Почему ты решил что они уже такими приходят?...
Напиши полностью процедурку приема данных...
Хорошо не там, где нас нет, а там, где нас еще небыло!!!
Рустам вне форума Ответить с цитированием
Старый 26.09.2007, 21:23   #3
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

Цитата:
Почему ты решил что они уже такими приходят?...
Напиши полностью процедурку приема данных...
Действительно, я не совсем точно выразился, но когда выполнится
Код:
Str:=ClientSocket1.Socket.ReceiveText;
в переменной str находятся все строки переданные сервером .

Это и есть процедура приема данных...
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 26.09.2007, 23:02   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

нужно создать свой формат пакета )) для данного случая подойдет

Код:
tpacket = packet record
dwSize: WORD;
Str: PCHAR;
end;
тобиш делаеш такую переменную и посылаеш в send или как там в тех компонентах сначала dwSize а потом Str - во избежание ошибок и не приятностей... соотвественно когда прием данных то ты читаеш размер dwSize - и дальше ты уже знаеш сколько тебе читать символов ))) ну а потом опять сначала и так пока допустим не прийдет команда какайнить ну например размер пакета 0 )

я так делаю.. проблем нет ) правда на api )
BOBAH13 вне форума Ответить с цитированием
Старый 22.09.2008, 15:18   #5
Vovandows
Пользователь
 
Аватар для Vovandows
 
Регистрация: 22.09.2008
Сообщений: 11
Подмигивание

Цитата:
Сообщение от AlDelta Посмотреть сообщение
Код:
i:=1;
while StringGrid1.Cells[0,i]<>'' do
Begin
ServerSocket1.Socket.Connections[0].SendText(StringGrid1.Cells[0,i]);
i:=i+1;
End;
Попробуй вот так:

Код:
i:=1;
while StringGrid1.Cells[0,i]<>'' do
Begin
ServerSocket1.Socket.Connections[0].SendText(StringGrid1.Cells[0,i]);
i:=i+1;
Sleep(100);
End;
Работает нимножко медленнее но коректно
Vovandows вне форума Ответить с цитированием
Старый 23.09.2008, 20:38   #6
ToLeG
Пользователь
 
Регистрация: 12.09.2008
Сообщений: 37
По умолчанию

Выдирай значения из грида в листбох или мэмо, или сохдай подобную переменную, например
var list:Tlistbox
а потом отправляй вот так:
ServerSocket1.Socket.Connections[0].SendText(list.items.text);
а клиент принимает вот так
Str:=ClientSocket1.Socket.ReceiveTe xt;
listbox.items.text:=str;
клиент сам все разобьет по строчкам
=)
ToLeG вне форума Ответить с цитированием
Старый 24.09.2008, 02:01   #7
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

Ну парни жжоте, хорошие советы)
AlDelta, c асинхронностью знаком?
"источник" не будет ждать пока "приемник" заберет данные из сокета, поэтому шлет дальше.
Могу предложить как вариант:
отправляешь 1ю строку и ждешь "подтверждения" от клиента что строку приняли, и только тогда уже можно передавать следующую... тогда получиться какбы синхронно, и косяки отпадут... ну или появяться новые xDDD

Цитата:
Код:
:=1;
while StringGrid1.Cells[0,i]<>'' do
Begin
ServerSocket1.Socket.Connections[0].SendText(StringGrid1.Cells[0,i]);
i:=i+1;
Sleep(100);
End;
Работает нимножко медленнее но коректно
Если клиент будет прилично нагружен, то корретность эта быстро пропадет...

Последний раз редактировалось Ring0Sn; 24.09.2008 в 02:05.
Ring0Sn вне форума Ответить с цитированием
Старый 24.09.2008, 08:15   #8
ToLeG
Пользователь
 
Регистрация: 12.09.2008
Сообщений: 37
По умолчанию

Ring0Sn, а чем тебе мой пример не понравился?)) ведь передать сразу весь текст проще и быстрее, чем ждать пока на каждую строчку прийдет подтверждение! =) представь если будет 1000 строчет, а если 10000? =))
ToLeG вне форума Ответить с цитированием
Старый 24.09.2008, 16:55   #9
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

Цитата:
Сообщение от ToLeG Посмотреть сообщение
Ring0Sn, а чем тебе мой пример не понравился?)) ведь передать сразу весь текст проще и быстрее, чем ждать пока на каждую строчку прийдет подтверждение! =) представь если будет 1000 строчет, а если 10000? =))
Да хоть 1 000 000 000 000 000 000
Ring0Sn вне форума Ответить с цитированием
Старый 25.09.2008, 08:05   #10
ToLeG
Пользователь
 
Регистрация: 12.09.2008
Сообщений: 37
По умолчанию

Цитата:
Сообщение от Ring0Sn Посмотреть сообщение
Да хоть 1 000 000 000 000 000 000
А, ну да, конечно, а ждать не запаришься?! это значит по сети должно пройти 2 000 000 000 000 000 000 пакетов! ты рихнулся?! а если еще сеть будет загружена прилична, то состаришся нахрен пока дождешься!!!!
ToLeG вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[TcpClient, TcpServer] или [ServerSocket, ClientSocket] работа через прокси DOLBY Работа с сетью в Delphi 2 17.09.2009 05:46
Serversocket,clientsocket prizrak1390 Работа с сетью в Delphi 10 21.04.2009 16:04
Вопрос про ServerSocket и ClientSocket civic.qip Работа с сетью в Delphi 8 27.09.2008 02:04
Работа с Clientsocket и Serversocket prizrak1390 Работа с сетью в Delphi 3 26.04.2008 22:59
Events в ServerSocket и ClientSocket LiFeStyle Работа с сетью в Delphi 3 22.11.2007 22:26