Ich habe ein Programm enwickelt, das per FTP Daten an einen Server schickt. Nun hat sich in der Praxis herausgestellt, daß der Port 21 in Firmennetzwerken sehr oft gesperrt ist. Deswegen möchte ich jetzt den Transfer über HTTP bzw Port 80 abwickeln. Hat jemand bereits Erfahrung damit. Da diese Änderung für mich einer Neuprogrammierung gleichkommt wäre ich über Erfahrungen und Anregungen dankbar!
Announcement
Collapse
No announcement yet.
http/httpd Komponente
Collapse
X
-
Hallo,
das folgende Beispielprojekt demonstriert, wie man über eine TCP/IP-Verbindung (frei wählbarer Port) beliebig grosse Daten vom Client zum Server übertragen kann. Dabei wird eine blockierende Socket-Verbindung genutzt, so das der Server für jede Client-Datenübertragung einen Thread abspaltet.
<b>Server (TServerSocket)</b>
In dem <b>TServerClientThread</b>-Nachfolger muss nur die Methode Execute überschrieben werden:
<pre>
TClientThread = Class(TServerClientThread)
private
public
procedure ClientExecute; override;
end;
</pre>
Die Execute-Methode des Thread verwendet <b>TWinSocketStream</b>, um die Daten auszulesen und <b>TFileStream</b>, um die ausgelesenen Daten in eine Datei zu schreiben:
<pre>
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 := Format('C:\Temp\Socket%d.dat', [iFileCount]);
// 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;
</pre>
Das TServerSocket-Ereignis <b>OnGetThread</b> tritt ein, wenn der Server-Socket einen neuen Thread für eine Verbindung zu einem Client-Socket erstellen muss:
<pre>
procedure TFormServer.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TClientThread.Create(False, ClientSocket);
end;
</pre>
<b>Client (TClientSocket)</b>
<pre>
procedure TFormClient.ButtonSendClick(Sender: TObject);
var
aWSS : TWinSocketStream;
aFS : TFileStream;
begin
if not OpenDialog1.Execute then
Exit;
StatusBar1.SimpleText := 'Sockets sind offen';
ClientSocket1.Open;
aWSS := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
aFS := TFileStream.Create(OpenDialog1.FileName, fmShareDenyWrite);
try
aWSS.CopyFrom(aFS, 0);
finally
aWSS.Free;
aFS.Free;
ClientSocket1.Close;
end;
end;
</pre>
Comment