Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
14-90129
Saturn
2003-11-03 13:29
2003.11.27
Microsoft Visual Studio .NET


1-89942
Pert
2003-11-17 21:29
2003.11.27
из Edit a в переменную


4-90174
frost63
2003-10-02 07:16
2003.11.27
Файлы Office.


1-89917
Zheks
2003-11-18 11:41
2003.11.27
Файловая система Виндов


14-90114
Думкин
2003-11-04 05:10
2003.11.27
С днем рождения! 4 ноября.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский