AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TserverSocket und TclientSocket
Thema durchsuchen
Ansicht
Themen-Optionen

TserverSocket und TclientSocket

Ein Thema von Briand · begonnen am 18. Aug 2012 · letzter Beitrag vom 21. Aug 2012
 
Briand
(Gast)

n/a Beiträge
 
#1

TserverSocket und TclientSocket

  Alt 18. Aug 2012, 23:18
Hallo,

Ich bin mal wieder dabei mit delphi herumzuspielen. Im moment versuche ich mich an einem Dateitransfer mit server/client.

Ich benutze TServerSocket und TClientServer. Soweit funktioniert alles ganz gut.

Kleine Frage kommt aber auf.

Wenn ich eine Datei am runterladen bin dann reagiert mein Fenster nicht mehr bis der DL abgeschlossen ist.
Ich hab schon mit Google gesucht und Foren gefunden wo darauf hingewiesen wurde man solle das mit einem Thread machen.
Habe auch schon paar Thread beispiele angeschaut aber keines gefunden das Threading mit den Socket Komponenten erklährt.

hier ein Beispiel von meinem Server.

Delphi-Quellcode:
 
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ImageList1: TImageList;
    memLog: TMemo;
    ServerSock: TServerSocket;
    TransferSock: TServerSocket;
    Button1: TButton;
    ProgressBar: TProgressBar;
    procedure ServerSockClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSockClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure ServerSockClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure TransferSockClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    IncommingStream: TFileStream;
    Size: integer;
  public
    { Public declarations }
    TransferName: String;
  end;

var
  Form1: TForm1;

implementation

uses Unit6;

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSock.Socket.Connections[0].SendText('000' + 'c:\meinedatei.txt');
TransferName := 'meinedatei.txt';
end;

procedure TForm1.ServerSockClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
memLog.Lines.Add(' .:: Client ' + Socket.RemoteAddress + ' Disconnected');
end;

procedure TForm1.ServerSockClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
memLog.Lines.Add(' .:: Error ' + IntToStr(ErrorCode));
end;

procedure TForm1.ServerSockClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
  ReceivedText, cmd, data: string;
  i: integer;
  Item: TListItem;
  StrLst: TStringList;
begin
  ReceivedText := Socket.ReceiveText;
  cmd := Copy(ReceivedText, 0, 3);
  data := Copy(ReceivedText, 4, Length(ReceivedText));

  if cmd = '000then
  begin
    memLog.Lines.Add(data);
  end;

  if cmd = '001then
  begin
    memLog.Lines.Add(' .:: Client connected: ' + data + ' on ' + socket.RemoteAddress);
  end;

  if cmd = '002then
  begin
    Size := StrToInt(Data);
    Form1.ProgressBar.Min := 0;
    Form1.ProgressBar.Max := Size;
    memLog.Lines.Add(' .:: Receiving file of size ' + Data + ' bytes');
    IncommingStream := TFileStream.Create(Form1.TransferName, fmCREATE or fmOPENWRITE and fmsharedenywrite);

    TransferSock.Open;
  end;

end;

procedure TForm1.TransferSockClientRead(Sender: TObject;
  Socket: TCustomWinSocket);

  var
  Buffer: array [0..9999] of Char;
  IncommingLen, RecievedLen: integer;

  begin

  IncommingLen := socket.ReceiveLength;

  while IncommingLen > 0 do
  begin
    RecievedLen := socket.ReceiveBuf(Buffer, Sizeof(Buffer));

    if RecievedLen <= 0 then
      Break
    else
      IncommingStream.Write(Buffer, RecievedLen);

    Form1.ProgressBar.StepBy(RecievedLen);

    if IncommingStream.Size >= Size then
    begin
      IncommingStream.Free;
      ServerSock.Socket.Connections[0].SendText('002');
      Form1.ProgressBar.Position := 0;
      if Form1.TransferName = 'Desktop.bmpthen;
      Break;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
memLog.Lines.Add('Listening on Port ' + '21');
ServerSock.Port := 21;
ServerSock.Open;
end;

end.
Bin für jede Hilfe dankbar oder auch kleine Beispile.

Danke im Vorraus
Briand

Geändert von Briand (19. Aug 2012 um 01:20 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz