не могу передать файл в локалке.
1. через TClientSocket и TServerSoket невыходит - текстовики передаются на ура, а бинарники (exe, картинки и тд) ломаются.
2. через Indy не могу найти примеры - есть примеры на инди 9, а в делфи 2010 исп-ся инди 10, а в инди 9 и 10 разные процедуры, функции и свойства.
помогите плиз рабочим исходником или куском кода на Delphi 2010
icq 474492073
email: casper@i-am-the-best.ru
Другие языки программирования и технологии
Delphi 2010 + LAN + передача файлов = ???
Вот код отправки файла через TClientSocket
procedure SendFile(V_ID, F_ID, S_ID :integer; AFileName :string);
var
PHH: TPacketHeaderHolder;
PH: TPacketHeader;
FileStm: TFileStream;
begin
if not ClientSocket.Active or (ClientStatus <> csConnected)
then begin
MessageDlg('Not connected.', mtError, [mbOK], 0);
Exit;
end;
try
FileStm := TfileStream.Create(AFileName, fmOpenRead or fmShareDenyNone);
PHH := TPacketHeaderHolder.Create(ptQuery);
try
FileStm.Position := 0;
PHH.DataSize := FileStm.Size;
PHH.DataHash := CalcMD5(FileStm);
PHH.PacketCommand := pcSendFile;
PHH.VerIdFile := V_ID;
PHH.SessionId := S_ID;
PHH.FileId := F_ID;
PH := PHH.PacketHeader;
finally
FreeAndNil(PHH);
end;
FileStm.Position := 0;
with ClientSocket.Socket do begin
SendBuf(PH, SizeOf(PH));
SendStream(FileStm);
ClientStatus := csWaitingReply;
end;
except
FreeAndNil(FileStm);
raise;
end;
end;
вот код приема файла
procedure WholePacketReceived(const Socket: TSSSServerClientWinSocket);
const
SHashArr: array [Boolean] of PChar = ('failed', 'Ok');
var
Query, Command, Params: String;
CurHash: TPacketHeaderHash;
HashOK: Boolean;
AV_ID, AF_ID, AS_ID :integer;
APC :TPacketCommand;
FS :TFileStream;
DirName, FileName :string;
FileCreated :boolean;
begin
if Socket = nil then
Exit;
with Socket, Socket.LastPacketHeader do
begin
if Int64(Length(SocketBuffer)) <> Int64(DataSize) then
Exit;
CurHash := CalcMD5(Pointer(SocketBuffer)^, DataSize);
HashOK := CompareMem(@CurHash, @DataHash, SizeOf(CurHash));
end;
WriteLog('*** WholePacketReceived(): data hash %s ***', [SHashArr[HashOK]]);
if not HashOK then
begin
Socket.ClearData;
Exit;
end;
case Socket.LastPacketHeader.PacketType of
ptQuery:
begin
AV_ID := Socket.LastPacketHeader.VerIdFile;
AF_ID := Socket.LastPacketHeader.FileId;
AS_ID := Socket.LastPacketHeader.SessionID;
APC := Socket.LastPacketHeader.PacketCommand;
case APC of
pcGetFile: begin // Запрос файла клиентом
Socket.ClearData;
SendFile(Socket, AV_ID, AF_ID, AS_ID);
end;
pcGetScreenshot: begin
Socket.ClearData;
GetScreenshot(Socket);
end;
pcSendFile: begin //Получаем файл от клиента
if AV_ID <> 0
then begin
DirName := 'v' + IntToStr(AV_ID);
if not DirectoryExists(FileArcAddr + DirName)
then
try
CreateDir(FileArcAddr + DirName);
except
WriteLog('Невозможно создать каталог "' + DirName + '"');
end;
FileName := ( 'f'+inttostr(AF_ID)+'_s'+inttostr(AS_ID) );
FileCreated := true;
try
FS := TFileStream.Create((FileArcAddr + DirName + '\' + FileName), fmCreate);
try
FS.WriteBuffer(Pointer(Socket.SocketBuffer)^, Length(Socket.SocketBuffer));
finally
FreeAndNil(FS);
end;
except
FileCreated := false;
end;
if FileCreated
then SendReply(Socket, AV_ID, AF_ID, AS_ID, 'File write Ok')
else SendReply(Socket, AV_ID, AF_ID, AS_ID, 'File write fail');
end;
end;
else
end;
end;
end;
end;
код ответа
procedure SendReply(const Socket: TSSSServerClientWinSocket;
V_ID, F_ID, S_ID :integer; AttachCommand: string);
var
PHH: TPacketHeaderHolder;
PH: TPacketHeader;
begin
if (Socket = nil) or (Socket.ServerStatus = ssDisconnected) or (V_ID = 0) then
Exit;
PHH := TPacketHeaderHolder.Create(ptReply);
try
PHH.DataSize := Length(AttachCommand);
PHH.DataHash := CalcMD5(AttachCommand);
PHH.VerIdFile := V_ID;
PHH.SessionId := S_ID;
PHH.FileId := F_ID;
PHH.PacketCommand := pcCommandInAttach;
PH := PHH.PacketHeader;
finally
FreeAndNil(PHH);
end;
Socket.SendBuf(PH, SizeOf(PH));
Socket.SendText(AttachCommand);
end;
Еще следует прописать обработку событий
ServerSocketClientConnect
ServerSocketClientDisconnect
ServerSocketClientError
ServerSocketClientRead
ServerSocketGetSocket
если надо могу их расписать
Код работает отлично отправляет и получает файлы полностью
procedure SendFile(V_ID, F_ID, S_ID :integer; AFileName :string);
var
PHH: TPacketHeaderHolder;
PH: TPacketHeader;
FileStm: TFileStream;
begin
if not ClientSocket.Active or (ClientStatus <> csConnected)
then begin
MessageDlg('Not connected.', mtError, [mbOK], 0);
Exit;
end;
try
FileStm := TfileStream.Create(AFileName, fmOpenRead or fmShareDenyNone);
PHH := TPacketHeaderHolder.Create(ptQuery);
try
FileStm.Position := 0;
PHH.DataSize := FileStm.Size;
PHH.DataHash := CalcMD5(FileStm);
PHH.PacketCommand := pcSendFile;
PHH.VerIdFile := V_ID;
PHH.SessionId := S_ID;
PHH.FileId := F_ID;
PH := PHH.PacketHeader;
finally
FreeAndNil(PHH);
end;
FileStm.Position := 0;
with ClientSocket.Socket do begin
SendBuf(PH, SizeOf(PH));
SendStream(FileStm);
ClientStatus := csWaitingReply;
end;
except
FreeAndNil(FileStm);
raise;
end;
end;
вот код приема файла
procedure WholePacketReceived(const Socket: TSSSServerClientWinSocket);
const
SHashArr: array [Boolean] of PChar = ('failed', 'Ok');
var
Query, Command, Params: String;
CurHash: TPacketHeaderHash;
HashOK: Boolean;
AV_ID, AF_ID, AS_ID :integer;
APC :TPacketCommand;
FS :TFileStream;
DirName, FileName :string;
FileCreated :boolean;
begin
if Socket = nil then
Exit;
with Socket, Socket.LastPacketHeader do
begin
if Int64(Length(SocketBuffer)) <> Int64(DataSize) then
Exit;
CurHash := CalcMD5(Pointer(SocketBuffer)^, DataSize);
HashOK := CompareMem(@CurHash, @DataHash, SizeOf(CurHash));
end;
WriteLog('*** WholePacketReceived(): data hash %s ***', [SHashArr[HashOK]]);
if not HashOK then
begin
Socket.ClearData;
Exit;
end;
case Socket.LastPacketHeader.PacketType of
ptQuery:
begin
AV_ID := Socket.LastPacketHeader.VerIdFile;
AF_ID := Socket.LastPacketHeader.FileId;
AS_ID := Socket.LastPacketHeader.SessionID;
APC := Socket.LastPacketHeader.PacketCommand;
case APC of
pcGetFile: begin // Запрос файла клиентом
Socket.ClearData;
SendFile(Socket, AV_ID, AF_ID, AS_ID);
end;
pcGetScreenshot: begin
Socket.ClearData;
GetScreenshot(Socket);
end;
pcSendFile: begin //Получаем файл от клиента
if AV_ID <> 0
then begin
DirName := 'v' + IntToStr(AV_ID);
if not DirectoryExists(FileArcAddr + DirName)
then
try
CreateDir(FileArcAddr + DirName);
except
WriteLog('Невозможно создать каталог "' + DirName + '"');
end;
FileName := ( 'f'+inttostr(AF_ID)+'_s'+inttostr(AS_ID) );
FileCreated := true;
try
FS := TFileStream.Create((FileArcAddr + DirName + '\' + FileName), fmCreate);
try
FS.WriteBuffer(Pointer(Socket.SocketBuffer)^, Length(Socket.SocketBuffer));
finally
FreeAndNil(FS);
end;
except
FileCreated := false;
end;
if FileCreated
then SendReply(Socket, AV_ID, AF_ID, AS_ID, 'File write Ok')
else SendReply(Socket, AV_ID, AF_ID, AS_ID, 'File write fail');
end;
end;
else
end;
end;
end;
end;
код ответа
procedure SendReply(const Socket: TSSSServerClientWinSocket;
V_ID, F_ID, S_ID :integer; AttachCommand: string);
var
PHH: TPacketHeaderHolder;
PH: TPacketHeader;
begin
if (Socket = nil) or (Socket.ServerStatus = ssDisconnected) or (V_ID = 0) then
Exit;
PHH := TPacketHeaderHolder.Create(ptReply);
try
PHH.DataSize := Length(AttachCommand);
PHH.DataHash := CalcMD5(AttachCommand);
PHH.VerIdFile := V_ID;
PHH.SessionId := S_ID;
PHH.FileId := F_ID;
PHH.PacketCommand := pcCommandInAttach;
PH := PHH.PacketHeader;
finally
FreeAndNil(PHH);
end;
Socket.SendBuf(PH, SizeOf(PH));
Socket.SendText(AttachCommand);
end;
Еще следует прописать обработку событий
ServerSocketClientConnect
ServerSocketClientDisconnect
ServerSocketClientError
ServerSocketClientRead
ServerSocketGetSocket
если надо могу их расписать
Код работает отлично отправляет и получает файлы полностью
> через TClientSocket и TServerSoket невыходит
У тебя ошибки в программе.
> через Indy не могу найти примеры
На Инди свет клином не сошелся.
Кр. того, для начинающих это слишком сложный для понимания пакет.
В кач-ве разумной альтернативы Indy воспользуйся сторонней библиотекой Synapse.
У тебя ошибки в программе.
> через Indy не могу найти примеры
На Инди свет клином не сошелся.
Кр. того, для начинающих это слишком сложный для понимания пакет.
В кач-ве разумной альтернативы Indy воспользуйся сторонней библиотекой Synapse.
1 Установи тип файла в свойствах.
2 Я до сих пор пользуюсь Делфи 7
3 Но гораздо проще все делается просто на С++
2 Я до сих пор пользуюсь Делфи 7
3 Но гораздо проще все делается просто на С++
Похожие вопросы
- Delphi 2010 в delphi работает норм, срочно! ! курсач горит, через час сдавать (( а не работает
- Для передачи файлов в печать в типографию достаточно чтобы эти файлы имели расширение PDF?
- Есть ли какие-либо стандарты по упаковки потока данных для передачи файлов?
- Подключил комп и ноут кабелем crossover network. что делать дальше для передаче файлов с одного компа на другой?
- какой диск(болванка) нужен для передачи файла (игра)?
- Сохранение из StringGrid в файл и загрузка из файла - Delphi
- Delphi, работа с файлами
- Согласны с этим - Глубинные причины ненависти к Delphi/Pascal ?
- Delphi. Создать автоматически 100 текстовых файлов в папке. с именем от 0 до 99
- Delphi:Прочитал, что если при динамическом создании компонента если указать Name объекта, то в последующем можно ->