![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как лучше всего передавать информацию через сокеты ?
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]
Извените за такие словеячки как "щас", "чё-та", просто привык в чате так общаться :)
Чтоб никто ничего левого не подумал :)