Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как лучше всего передавать информацию через сокеты ?


Delpher_Gray ©   (2003-07-14 13:14:00) 

Всем доброго времени суток !
Подскажите плиз как лучше всего передаватинформацию через сокеты ??
Я пишу что-то вроде системы удалённого доступа к файлам компа, типа FTP...
Так вот я получаю список файлов какой либо директории путём FinFirst (*.*), потом передаю через TServerSocket путём SendText строку "f1000", что значет что щас прийдётт список файлов, размером 1000 байт...
Клиент переводится в режим ожидания сиска...
Потом до тех пор пока не принялось 1000 байт, записывает всё в строку, что-то типа: "file.exe|1379|03.10.1988|#"file.exe|1379|03.10.1988|#".
| - разделитель в каждом файле
# - разделитель между файлами
Потом клиент разделяет принятую строку и записывает всё в TListView...

Вот такой тупой алгоритм придумал я, но с ним бывают глюки... Подскажите как можно более НАДЁЖНОпредать информацию через сокеты...

Заранее благодарен !


Delpher_Gray   (2003-07-14 17:40:00) [1]

Угу ! Попробую чё-нить написать, не получется, тогда ещё чё-нить спрошу :)


Digitman   (2003-07-14 17:35:00) [2]


> можешь подсказать пример


не могу.
пример для каждого случая индивидуален.

а логика такова :

событие OnWrite() возникает как минимум 1 раз (сразу за событием OnConnect) и всякий раз после освобождения буфера передачи, если обращение к нему по записи дало отказ из-за занятости буфера.

обращение по записи - это методы-ФУНКЦИИ объекта TCustomWinSocket : SendBuf(), SendText(), SensStream().
См. описания результатов выполнения первых двух из упомянутых


Delpher_Gray   (2003-07-14 17:27:00) [3]

2Digitman:
А можешь подсказать пример использования OnWrite ??

Заранее благодарен !


Digitman   (2003-07-14 13:52:00) [4]


> чё за OnWrite


без обработки этого события в неблок.режиме ничего путного у тебя не получится.


Delpher_Gray   (2003-07-14 13:44:00) [5]

Неа... Нету :(
А чё за OnWrite ??

На событие OnClientRead, TServerSocket"а если Receive = true тогда GetFilesList(Socket.ReceiveText).

Вот...
А Receive - режим принимающего !!!


Delpher_Gray   (2003-07-14 13:42:00) [6]

А вообще такой метод, через который я передаю и принемаю можно использовать ?? ИЛи есть ещё какие-нить методы кроме передачи строк ?


Digitman   (2003-07-14 13:42:00) [7]


> Код на приём


и где тут прием ? ни намека даже на гнездовые функции

к тому же на стороне передатчика, скорей всего, нет обработки OnWrite()


Delpher_Gray   (2003-07-14 13:38:00) [8]

Код на приём списка (если клиент в режиме приёма файла):

procedure GetFilesList(List: string);
var
FileType: string;
FileStr: string;
begin
StrDate := StrDate + List;

if Length(StrDate) >= Size then
begin
MainForm.Status.SimpleText := "Выводим список файлов...";
while Pos("#", StrDate) <> 0 do
begin
FileStr := Copy(StrDate, 1, Pos("#", StrDate) -1);
MainForm.LvFilesList.Items.Add.Caption := Copy(StrDate, 1, Pos("|", StrDate) -1);
Delete(StrDate, 1, Pos("|", StrDate));
FileType := Copy(StrDate, 1, Pos("|", StrDate) -1);
Delete(StrDate, 1, Pos("|", StrDate));
MainForm.LvFilesList.Items[MainForm.LvFilesList.Items.Count -1].SubItems.Add(Copy(StrDate, 1, Pos("|", StrDate) -1));
Delete(StrDate, 1, Pos("|", StrDate));
MainForm.LvFilesList.Items[MainForm.LvFilesList.Items.Count -1].SubItems.Add(Copy(StrDate, 1, Pos("|", StrDate) -1));

if FileType = "Directory" then
MainForm.LvFilesList.Items[MainForm.LvFilesList.Items.Count -1].ImageIndex := 0
else
MainForm.LvFilesList.Items[MainForm.LvFilesList.Items.Count -1].ImageIndex := 1;

( StrDate, 1, Pos("#", StrDate)

Код на приём списка (если клиент в режиме приёма файла):

procedure GetFilesList(List: string);
var
FileType: string;
FileStr: string;
begin
StrDate := StrDate + List;

if Length(StrDate) >= Size then
begin
MainForm.Status.SimpleText := "Выводим список файлов...";
while Pos("#", StrDate) <> 0 do
begin
FileStr := Copy(StrDate, 1, Pos("#", StrDate) -1);
MainForm.LvFilesList.Items.Add.Caption := Copy(StrDate, 1, Pos("|", StrDate) -1);
Delete(StrDate, 1, Pos("|", StrDate));
FileType := Copy(StrDate, 1, Pos("|", StrDate) -1);
Delete(StrDate, 1, Pos("|", StrDate));
MainForm.LvFilesList.Items[MainForm.LvFilesList.Items.Count -1].SubItems.Add(Copy(StrDate, 1, Pos("|", StrDate) -1));
Delete(StrDate, 1, Pos("|", StrDate));
MainForm.LvFilesList.Items[MainForm.LvFilesList.Items.Count -1].SubItems.Add(Copy(StrDate, 1, Pos("|", StrDate) -1));

if FileType = "Directory" then
MainForm.LvFilesList.Items[MainForm.LvFilesList.Items.Count -1].ImageIndex := 0
else
MainForm.LvFilesList.Items[MainForm.LvFilesList.Items.Count -1].ImageIndex := 1;

Delete(StrDate, 1, Pos("#", StrDate));
end;
MainForm.Status.SimpleText := "Список файлов получен и выведен";

Receive := false;
ReceiveType := "";
end;
end;CODE>

Принемает строки типа: "file.exe"file"1379"03.10.1988".


Digitman   (2003-07-14 13:33:00) [9]


> Иногда не всё передастся, иногда выведится не правильно


ну и как тебе подсказать ? если код не приводишь ?


Delpher_Gray   (2003-07-14 13:29:00) [10]

2Digitman:
Иногда не всё передастся, иногда выведится не правильно, но и т.д..........


Delpher_Gray   (2003-07-14 13:24:00) [11]

Метод через FTP - отподает !! Нужно именно так как я написал ! В этом и вся проблема !!


Digitman   (2003-07-14 13:24:00) [12]


> просто привык в чате так общаться


отвыкай.


> с ним бывают глюки


гадать будем какие ?


Карелин Артем   (2003-07-14 13:20:00) [13]

Передавай по FTP. Не изобретай велосипед, бери готовый.


Delpher_Gray   (2003-07-14 13:16:00) [14]

Извените за такие словеячки как "щас", "чё-та", просто привык в чате так общаться :)
Чтоб никто ничего левого не подумал :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо