Форум: "Сети";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];
ВнизSocket Найти похожие ветки
← →
MakNik (2003-10-03 11:25) [0]Есть несколько файлов, которые нужно последовательно передать через Socket. Подскажите, пожалуйста, как это корректно сделать?
← →
Digitman (2003-10-03 12:18) [1]в чем ты видишь некорректность того, что ты уже предпринял на это момент по сабжу ?
← →
MakNik (2003-10-03 13:04) [2]Как отслеживать что файл уже получен и отправлять запрос на другой файл?
← →
Digitman (2003-10-03 13:38) [3]а как ты это сейчас делаешь ? пусть некорректно, но - как ?
код приводи
← →
Verg (2003-10-03 14:15) [4]Это вопрос лежит вне сокетов.
Представь, что сокет (после установления соединения) - это просто "трехпроводка", соединяющая два компьютера. Ну или просто, ты (клиент) позвонил, например, в горсправку, диспетчер (сервер) снял трубку... Все, далее вы разговариваете совершенно равноправно. А вот поймете ли вы друг - друга - это определяется раньше и уж точно не телефоном: по крайней мере вы просто должны говорить на одном и том же языке (протоколе).
Вот и придумывай протокол - как договорится принимающей и передающей стороне о файлах, их размерах и проч.....
← →
MakNik (2003-10-03 14:35) [5]На клиенте:
procedure TForm1.Button6Click(Sender: TObject);
var
f:textfile;
Str:String;
i,j:integer;
FileName:string;
CRC:Cardinal;
T:string;
begin
AssignFile(f,"List.ini");
Reset(F);
While not eof(F) do
begin
Readln(f,STR);
if (STR<>"") and (STR[1]="F") then//Файл формат: F FileName CRC
begin
//Вытягиваем имя файла
i:=2;
while (STR[i]=" ") and ( i<=(Length(STR)) ) do inc(i); // пропускаем пробелы после F
j:=i;
while (STR[j]<>" ") and ( j<=(Length(STR)) ) do inc(j); // Ищем окончание имени файла
FileName:=Copy(STR,i, (j-i+1) );
//вытягиваем CRC
T:=Trim(Copy(STR,j, (Length(Str)-j+1) ));
CRC:=STRtoInt64(T);
// CRC:=STRtoInt64( Trim(Copy(STR,j, (Length(Str)-j+1) )));
if (not FileExists(FileName)) or ( GetCheckSum(FileName)<>CRC) then
begin
ClientSocket1.Socket.SendText("send "+FileName);
end;
end;
end;
CloseFile(f);
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
// l: Integer;
// buf: PChar;
// src: TFileStream;
F:textfile;
s, sl: string;
begin
Memo1.Lines.Add("OnRead");
s:= Socket.ReceiveText;
// Если мы не в режиме приёма:
if not Reciving then
begin
// Теперь нам необходимо получить длину потока данных.
SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
StrLCopy(@sl[1], PChar(s), Length(sl)-1);
DataSize:= StrToInt(sl);
AssignFile(F,SendFileName);
Rewrite(f);
closeFile(f);
Data:= TFileStream.Create(SendFileName,fmOpenReadWrite);
// Удаляем информацию о размере из данных.
Delete(s, 1, Length(sl));
Reciving:= true;
end;
// Сохраняем данные в файл, до тех пор, пока не получим все данные.
try
Data.Write(s[1], length(s));
if Data.Size = DataSize then
begin
Data.Position:= 0;
// Image2.Picture.Bitmap.LoadFromStream(Data);
Data.Free;
Reciving:= false;
// Socket.Close;
end;
except
Data.Free;
end;
End;
На сервере:
procedure TServer.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
ms: TFileStream;
FileName:string;
SocketReceiveText:string;
begin
Memo1.Lines.Add("OnClientRead");
// Клиент получает команду на передачу файла.
SocketReceiveText:=Socket.ReceiveText;
// if Copy(SocketReceiveText,0,4) = "get" then
// begin
// end;
if Copy(SocketReceiveText,0,4) = "send" then
begin
FileName:=Copy(SocketReceiveText,6, (Length(SocketReceiveText)-5));
try
// Получаем данные на передачу.
ms:=TFileStream.Create(FileName,fmOpenRead);
ms.Position:= 0;
// Добавляем длину данных, чтобы клиент знал, сколько данных будет передано
// Добавляем #0 , чтобы можно было определить, где заканчивается информация о размере.
Socket.SendText(IntToStr(ms.Size) + #0);
// Посылаем его.
Socket.SendStream(ms);
except
// Итак, осталось освободить поток, если что-то не так.
ms.Free;
end;
end;
end;
← →
Digitman (2003-10-03 14:50) [6]нет обработки OnWrite()
ни на клиентской ни на серверной стороне
без оных вся эта "кухня" работать как положено не будет никогда
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.023 c