Hallo,<br>mit den hier gefundenen Beispielen zum TWinSocketStream habe ich prima Dateien vom Client zum Server senden können. Was muß ich aber machen, wenn ich über eine blockierende Verbindung eine Datei vom Server zum Client schieben will. Das soll ungefähr so laufen: Der Client sendet dem Server bestimmte ID und einen Dateinamen. Über die ID weiss der Server, dass er eine Datei zum Client senden soll und über den Dateinamen weiss er dann auch welche Datei.<br>:-) Jens Schumann
Announcement
Collapse
No announcement yet.
Dateien vom Client zum Server
Collapse
X
-
Hallo,
das Schöne an Client/Server liegt ja darin, dass Server und Client beliebig austauschbar sind. Ich würde daher folgendes machen:
a) "Server" <br>
Verwendet eine <b>TServerSocket</b>-Instanz, um die Datei-Anforderungen des Clients zu erkennen. Anschließend wird eine <b>TClientSocket</b>-Instanz verwendet, um diesen Dateiinhalt zum Client zu schicken.
<pre>
unit TestSrvFrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, ScktComp;
type
TForm1 = class(TForm)
StatusBarSrv: TStatusBar;
MemoSrvLog: TMemo;
ServerSocket1: TServerSocket;
ClientSocket1: TClientSocket;
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private-Deklarationen }
FFileName: String;
procedure DoSendData;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
FFileName := Socket.ReceiveText;
StatusBarSrv.SimpleText := FFileName;
MemoSrvLog.Lines.Add('OnRead -> Dateinamen erhalten');
DoSendData;
end;
procedure TForm1.DoSendData;
var
aWSS : TWinSocketStream;
aFS : TFileStream;
begin
ClientSocket1.Open;
aWSS := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
aFS := TFileStream.Create(FFileName, fmShareDenyWrite);
try
aWSS.CopyFrom(aFS, 0);
finally
aWSS.Free;
aFS.Free;
ClientSocket1.Close;
end;
MemoSrvLog.Lines.Add(Format('Datei »%s« wurde übertragen.',
[FFileName]));
end;
end.
</pre>


-
b) "Client" <br>
Verwendet eine <b>TClientSocket</b>-Instanz, um den Dateinamen zum Server zu schicken. Gleichzeitig implementiert der Cleint die <b>TServerSocket</b>-Instanz, um den übertragenen Dateiinhalt zu empfangen und abzuspeichern.
<pre>
unit TestCltFrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, ScktComp;
type
TFormClient = class(TForm)
StatusBar1: TStatusBar;
Label1: TLabel;
EditFilename: TEdit;
ButtonGet: TButton;
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
MemoCltLog: TMemo;
procedure ButtonGetClick(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
TClientThread = Class(TServerClientThread)
public
procedure ClientExecute; override;
end;
var
FormClient: TFormClient;
implementation
{$R *.DFM}
{ TClientThread }
procedure TClientThread.ClientExecute;
var
sFileName : String;
szBuffer : array[0..1024] of Char;
aWSStream : TWinSocketStream;
iBytes : Integer;
aFStream : TFileStream;
begin
FillChar(szBuffer, SizeOf(szBuffer), #0);
while not Terminated and ClientSocket.Connected do
begin
try
sFileName := FormClient.EditFilename.Text + '_Neu';
// Blockierende Sockets mit 60 Sekunden Timeout
aWSStream := TWinSocketStream.Create(ClientSocket, 60000);
aFStream := TFileStream.Create(sFileName, fmCreate);
try
// Client muss innerhalb von 5 Sekunden mit der Übertragung beginnen
if aWSStream.WaitForData(5000) then
repeat
iBytes := aWSStream.Read(szBuffer, SizeOf(szBuffer));
if iBytes = 0 then
// Fehlschlag -> Socket-Verbindung schliessen
ClientSocket.Close
else
aFStream.WriteBuffer(szBuffer, iBytes);
until not aWSStream.WaitForData(2000);
finally
aWSStream.Free;
ClientSocket.Close;
aFStream.Free;
end;
except
end;
end;
end;
procedure TFormClient.ButtonGetClick(Sender: TObject);
begin
ClientSocket1.Active := True;
end;
procedure TFormClient.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendText(EditFilename.Text);
ClientSocket1.Active := False;
end;
procedure TFormClient.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
MemoCltLog.Lines.Add('OnGetThread');
SocketThread := TClientThread.Create(False, ClientSocket);
end;
procedure TFormClient.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
MemoCltLog.Lines.Add('OnClientConnect');
end;
procedure TFormClient.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
MemoCltLog.Lines.Add('OnClientDisconnect');
end;
end.
</pre>
Comment
-
Hallo,
entweder sehe ich den Wald vor lauter Bäumen nicht,
oder ich mache grundsätzlich was falsch! Ich möchte
nichts anderes, als eine Datei, die ich per Dialog
auswähle, mittels ClientSocket zu einer ServerSocket
schicken. Ich habe das Beispiel ausprobiert, nur kommt
am Server - außer der Text (Datei-Name und Pfad) nichts
an.
Hat jemand ein Beispiel parrat, dass man als Muster über-
nehmen kann?
Mich würde vor allen Interessieren, wie ich auf der Server-
seite, die Daten (Textfile) weiterverarbeiten kann z.B. in
einem Memofeld oder einer Listbox.
Vielen Dan
Comment
Comment