Форум: "Сети";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];
ВнизКак лучше всего передавать информацию через сокеты ? Найти похожие ветки
← →
Delpher_Gray (2003-07-14 13:14) [0]Всем доброго времени суток !
Подскажите плиз как лучше всего передаватинформацию через сокеты ??
Я пишу что-то вроде системы удалённого доступа к файлам компа, типа 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 13:16) [1]Извените за такие словеячки как "щас", "чё-та", просто привык в чате так общаться :)
Чтоб никто ничего левого не подумал :)
← →
Карелин Артем (2003-07-14 13:20) [2]Передавай по FTP. Не изобретай велосипед, бери готовый.
← →
Delpher_Gray (2003-07-14 13:24) [3]Метод через FTP - отподает !! Нужно именно так как я написал ! В этом и вся проблема !!
← →
Digitman (2003-07-14 13:24) [4]
> просто привык в чате так общаться
отвыкай.
> с ним бывают глюки
гадать будем какие ?
← →
Delpher_Gray (2003-07-14 13:29) [5]2Digitman:
Иногда не всё передастся, иногда выведится не правильно, но и т.д..........
← →
Digitman (2003-07-14 13:33) [6]
> Иногда не всё передастся, иногда выведится не правильно
ну и как тебе подсказать ? если код не приводишь ?
← →
Delpher_Gray (2003-07-14 13:38) [7]Код на приём списка (если клиент в режиме приёма файла):
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".
← →
Delpher_Gray (2003-07-14 13:42) [8]А вообще такой метод, через который я передаю и принемаю можно использовать ?? ИЛи есть ещё какие-нить методы кроме передачи строк ?
← →
Digitman (2003-07-14 13:42) [9]
> Код на приём
и где тут прием ? ни намека даже на гнездовые функции
к тому же на стороне передатчика, скорей всего, нет обработки OnWrite()
← →
Delpher_Gray (2003-07-14 13:44) [10]Неа... Нету :(
А чё за OnWrite ??
На событие OnClientRead, TServerSocket"а если Receive = true тогда GetFilesList(Socket.ReceiveText).
Вот...
А Receive - режим принимающего !!!
← →
Digitman (2003-07-14 13:52) [11]
> чё за OnWrite
без обработки этого события в неблок.режиме ничего путного у тебя не получится.
← →
Delpher_Gray (2003-07-14 17:27) [12]2Digitman:
А можешь подсказать пример использования OnWrite ??
Заранее благодарен !
← →
Digitman (2003-07-14 17:35) [13]
> можешь подсказать пример
не могу.
пример для каждого случая индивидуален.
а логика такова :
событие OnWrite() возникает как минимум 1 раз (сразу за событием OnConnect) и всякий раз после освобождения буфера передачи, если обращение к нему по записи дало отказ из-за занятости буфера.
обращение по записи - это методы-ФУНКЦИИ объекта TCustomWinSocket : SendBuf(), SendText(), SensStream().
См. описания результатов выполнения первых двух из упомянутых
← →
Delpher_Gray (2003-07-14 17:40) [14]Угу ! Попробую чё-нить написать, не получется, тогда ещё чё-нить спрошу :)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c