Server/Client Dosya Transferi Hata!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Raskolnikov
Üye
Mesajlar: 37
Kayıt: 15 Tem 2010 10:43

Server/Client Dosya Transferi Hata!

Mesaj gönderen Raskolnikov »

Merhaba

Ben asagidaki kodlari kullanarak dosya transferini gerceklestiricem ancak dosya karsiya hep ".exe" dosyası olarak ve bozuk olarak geliyor bunun nedeni nedir acaba? Streamda problemmi var abaca? kontrol edermisiniz? Burada ornek olarak ".exe" verdim txt yapincada .exe olarak geliyor??


Client Bölümü

Kod: Tümünü seç

unit UnitMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ClientSocket1: TClientSocket;
    Edit1: TEdit;
    Edit2: TEdit;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
 ClientSocket1.Host:= Edit1.Text;
 ClientSocket1.Port:= StrToInt(Edit2.Text);
 ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
 ErrorCode:= 0;
end;

procedure ReadData(Socket: TCustomWinSocket; nSize: Integer);
var
  Buffer: array[0..1023] of Byte;
  read, currRead, buffSize: Integer;
  Stream: TMemoryStream;
begin
  Stream:= TMemoryStream.Create;
  buffSize := SizeOf(Buffer);
  try
    Stream.Clear;
    Stream.SetSize(nSize);
    read := 0;
    while (read < nSize) and (Socket.Connected) do
    begin
      if (nSize - read) >= buffSize then
        currRead := buffSize
      else
        currRead := (nSize - read);
      Socket.ReceiveBuf(buffer, currRead);
      Stream.WriteBuffer(buffer, currRead);
      read := read + currRead;
    end;
    Stream.Position := 0;
    Stream.SaveToFile('calc.exe');
    Stream.Free;
  except
  end;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
 Data: String;
 Size: Integer;
begin
  Data:= Socket.ReceiveText;

  if Copy(Data, 1, 4) = 'FILE' then
  begin
  Caption:= Data;
  Delete(Data, 1, Pos('|', Data));
  Size := StrToInt(Copy(Data, 1, Pos('|', Data) - 1));
  Delete(Data, 1, Pos('|', Data));
  if Size > 0 then ReadData(Socket, Size);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ClientSocket1.Socket.SendText('FILE');
end;

end.
Server Bölümü

Kod: Tümünü seç

program formless;

{$APPTYPE CONSOLE}

uses
   scktcomp, classes, sysutils, windows;

Type
  TMyApp = Class(TObject)
  Public
    Procedure Connect(Sender: TObject; Socket: TCustomWinSocket);
    Procedure Disconnect(Sender: TObject; Socket: TCustomWinSocket);
    Procedure Receive(Sender: TObject; Socket: TCustomWinSocket);
    procedure OnError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
End;

var
  MyApp: TMyApp;
  Server: TServerSocket;
  Msg : Tmsg;
  TimerHandle:WORD;
  Stream: TMemoryStream;

function SendData(Socket: TCustomWinsocket; Stream: TMemoryStream; Command: string): Boolean;
var
  Buffer: array[0..1023] of Byte;
  Read, CurrRead, BuffSize: Integer;
begin
  try
    Socket.SendText(Command + '|' + IntToStr(Stream.Size) + '|');
    buffSize := SizeOf(Buffer);
    read := 0;
    while (read < Stream.Size) and Socket.Connected do
    begin
      if (Stream.Size - read) >= buffSize then
        CurrRead := BuffSize
      else
        CurrRead := (Stream.Size - Read);
      Stream.ReadBuffer(Buffer, CurrRead);
      Socket.SendBuf(Buffer, CurrRead);
      Read := Read + CurrRead;
    end;
    Result := True;
  except
    Result := False;
  end;
end;

Procedure TMyApp.Connect(Sender: TObject; Socket: TCustomWinSocket);
Begin
  WriteLn('Connected');
End;

Procedure TMyApp.Disconnect(Sender: TObject; Socket: TCustomWinSocket);
Begin
  WriteLn('Disconnected');
End;

Procedure TMyApp.Receive(Sender: TObject; Socket: TCustomWinSocket);
Var
 Data: String;
Begin
 Data:= Socket.ReceiveText;
 if Data = 'FILE' then
  begin
    Stream := TMemoryStream.Create;
    Stream.LoadFromFile('calc.exe');
    Stream.Position:= 0;
    if SendData(Socket, Stream, 'FILE') then WriteLn('File Sended');
  end;
end;

procedure TMyApp.OnError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  ErrorCode := 0;
end;

//=======Timer=========
procedure Timer(Wnd:HWnd;Msg,TimerID,dwTime:DWORD);stdcall;
begin
//Code for your Timer Goes here
end;

procedure StartTimer(Interval:DWORD);
begin
  TimerHandle:=SetTimer(0,0,Interval,@Timer);
end;
//======Timer==========

begin
  MyApp := TMyApp.Create;
  //Create the socket.
  Server := TServerSocket.Create(nil);
  Server.OnClientConnect := MyApp.Connect;
  Server.OnClientDisconnect := MyApp.Disconnect;
  Server.OnClientRead := MyApp.Receive;
  Server.OnError := MyApp.OnError;
  //Choose the socket port here.
  Server.Port := 669;
  //Activate the socket.
  Server.Active := True;

  //Code to start the timer, the number is the timer interval.
  StartTimer(1000);

  //this code keeps the server open, stoping it from closing.
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;

end.
Kullanıcı avatarı
burak_489
Üye
Mesajlar: 31
Kayıt: 20 Ara 2010 09:20

Re: Server/Client Dosya Transferi Hata!

Mesaj gönderen burak_489 »

...
En son burak_489 tarafından 12 Mar 2011 12:46 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Raskolnikov
Üye
Mesajlar: 37
Kayıt: 15 Tem 2010 10:43

Re: Server/Client Dosya Transferi Hata!

Mesaj gönderen Raskolnikov »

Parselemeden kastın ne hocam? yani hangi bölüm hatayı gösterebilirmisin?
Kullanıcı avatarı
burak_489
Üye
Mesajlar: 31
Kayıt: 20 Ara 2010 09:20

Re: Server/Client Dosya Transferi Hata!

Mesaj gönderen burak_489 »

...
En son burak_489 tarafından 12 Mar 2011 12:43 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Server/Client Dosya Transferi Hata!

Mesaj gönderen G.Arkas »

Kod: Tümünü seç

  Stream.Position := 0;
    Stream.SaveToFile('calc.exe');
    Stream.Free;
Hata burada gelen dosyayı direk olarak kaydettirmen. Bunu parselerken Dosyaismi|Dosyaboyutu|Dosyauzantısı gibi parselemen gerekir.Stream ile gelen veriyi bu şekilde kaydedemezsin.Çünkü daha dosya içeriği gelmeden sen orada hayali bir "*.exe" uzantısı yartıp,Stream ile gelen verinin dosya boyutunu buna yazdırmış oluyorsun bir nevi ChangeOEP. TMemoryStream ile gelen veriyi detaylı parselemelisin yukarıda belirttiğim gibi gelen dosyayı bu şekilde ayıklayıp NAME|BOYUT|UZANTI şeklinde yapman yeterli olacaktır.
Resim
Cevapla