Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


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

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


Ответ
 
Опции темы
Старый 27.08.2013, 19:56   #1
SSSergey
 
Регистрация: 05.06.2007
Сообщений: 7
Вопрос Как отправить массив типа string по сети используя компоненты ClientSocket и ServerSocket

Я поставил перед собой задачу, отправить массив типа string по сети через компоненты ClientSocket и ServerSocket. Отправить у меня получилось, а вот с принятием массива проблемы, я понимаю, что данные при передачи разбиваются на пакеты, а вот как их собрать воедино не знаю.
Заранее прошу прощения, за возможно глупый вопрос. До этого момента с сетями и буфером не работал, прошу помочь с описанной выше проблемой. Спасибо за внимание.
Процедура отправки массива:
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   n:array [0..100] of string[255];

begin
n[0]:='111111111111111111111111111111111111111111111';
n[1]:='111111111111111111111111111111111111111111111';
n[2]:='111111111111111111111111111111111111111111111';
n[3]:='111111111111111111111111111111111111111111111';
n[4]:='111111111111111111111111111111111111111111111';
n[5]:='111111111111111111111111111111111111111111111';
n[6]:='111111111111111111111111111111111111111111111';
n[7]:='111111111111111111111111111111111111111111111';
ClientSocket1.Socket.SendBuf(n,sizeof(n))
end
Процедура приема массива:

Цитата:
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  mm:array [0..100] of string[255];
begin
 socket.ReceiveBuf(t,socket.ReceiveLength) ;
end;
SSSergey вне форума Ответить с цитированием
Старый 27.08.2013, 20:05   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
как их собрать воедино не знаю.
Да, для этого компонента проблема эта была.
http://delphiworld.narod.ru/_all_articles_.html
раздел Сокеты - [27]
Например там: http://delphiworld.narod.ru/base/long_data_blocks2.html
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2013, 20:28   #3
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,021
По умолчанию

враки! никаких проблем
ServerSocket1ClientRead - может сработать несколько раз, нужно склеивать!

протокол! где он?
гденачалогдеконец?

еще попробуй не строки а массивы символов
n:array [0..100] of array of char[0..255];
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 27.08.2013 в 20:42.
Slym вне форума Ответить с цитированием
Старый 27.08.2013, 20:52   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
никаких проблем
Я имел ввиду что сам он не склеит )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.08.2013, 05:07   #5
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цыклом. С помощью Socket.SendText():
Код:
var
i: integer;
begin
...//какой-то код до отправки
for i:=0 To Sizeof(n) do 
ClientSocket1.Socket.SendText(n[i]);
...//какой-то код после отправки
end;
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 28.08.2013, 06:41   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,855
По умолчанию

Я бы выкинул массив и сделал TStringList
Добавляем строки туда, в конце создаём Stream и сохраняем туда стринглист (SaveToStream у него, кажись, был).
Стрим отсылаем по сокету.
Клеить на принятии придётся самому, да, ничего не поделаешь. Моя функа:
Код:
function TClientDecor.ReceiveStream(Stream: TStream): Boolean;
var
  i: Integer;
  Buf: pointer;
begin
  Stream.Seek(0, soFromBeginning);
  repeat
    Sleep(500); // ничего лучше не придумал :(
    i := FClientSock.ReceiveLength(); // FClientSock: TClientWinSocket;
    GetMem(Buf, i);
    FClientSock.receivebuf(buf^, i);
    Stream.Write(Buf^, i);
    FreeMem(buf);
  until i = 0;
end;
Потом из стрима грузим в принимающий стринглист.
phomm вне форума Ответить с цитированием
Старый 28.08.2013, 08:26   #7
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,021
По умолчанию

Вот вот проблема не отправить, а принять!
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 28.08.2013, 08:54   #8
SSSergey
 
Регистрация: 05.06.2007
Сообщений: 7
По умолчанию

Ребята спасибо, решил отправлять через sendtext, а на приеме разбивать на массив. По моему это наиболее быстрое решение, сроки уже поджимают.
SSSergey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме 20000 рублей в месяц

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ServerSocket & ClientSocket Переменная & Массив stalker1995s Общие вопросы Delphi 1 10.11.2012 17:16
Как этим пользоватся(ClientSocket ServerSocket) macsmela Работа с сетью в Delphi 17 24.12.2011 09:39
ClientSocket y ServerSocket - как найти серверы leonw Работа с сетью в Delphi 15 12.07.2011 15:29
Люди Подскажите пожалуйста где в инете можно достать компоненты ServerSocket и ClientSocket Reds Компоненты Delphi 6 21.04.2009 14:11
обмен сообщениями между клиентом и сервером используя ClientSocket и ServerSocket xTANATOSx Работа с сетью в Delphi 3 04.10.2007 14:17


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS