Registriert seit: 19. Jul 2017
Ort: Berlin
47 Beiträge
Delphi XE7 Ultimate
|
AW: Multi Socket Transfer
17. Sep 2017, 12:15
also das Blocking ist im Client der die daten verschickt auf Nonblocking := 1 gestellt.
komisch ist das es ohne komprimirung funktioniert.
und so schaut die empfangsroutine im Server aus.
Delphi-Quellcode:
procedure TClientForm.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
Data: AnsiString;
SocketData: TSocketData;
begin
if Socket.Data = nil then begin
SocketData := TSocketData.Create;
Socket.Data := SocketData
end;
SocketData := TSocketData(Socket.Data);
Data := Socket.ReceiveText;
if Data = '' then Exit;
SocketData.Data := SocketData.Data + Data;
SocketData.ServerData.Wan := Socket.RemoteAddress;
DataCheck(Socket);
end;
procedure TClientForm.DataCheck(Socket: TCustomWinSocket);
var
Data,Command: String;
DataSize: string;
LengthDataSize,LengthSocketData: integer;
SocketData: TSocketData;
Li: TListItem;
H: THandle;
DL_Form: string;
ReceiveDataProc: procedure(Socket: TCustomWinSocket; Progress,Max: int64);
begin
if Socket = nil then exit;
if Socket.Data = nil then exit;
SocketData := TSocketData(Socket.Data);
SocketData.Socket := Socket;
if SocketData.Data = '' then exit;
DataSize := Split(SocketData.Data,'|',1);
LengthDataSize := Length(DataSize);
LengthSocketData := Length(SocketData.Data) - Length(DataSize) -1;
if SocketData.ReceiveDataProc <> nil then begin
@ReceiveDataProc := SocketData.ReceiveDataProc;
try
ReceiveDataProc(Socket,LengthSocketData,strtoint(DataSize));
except
end;
end;
try
if LengthSocketData < strtoint(DataSize) then exit;
except
SocketData.Data := '';
Exit;
end;
Delete(SocketData.Data,1,LengthDataSize+1);
try
Data := Copy(SocketData.Data,1,StrToInt(DataSize));
except
end;
Delete(SocketData.Data,1,Length(Data));
//-------------------------------------------------------------------------------------------------------------------------------
Data := Decompress(SocketData,Data); // Daten Entpacken
//-------------------------------------------------------------------------------------------------------------------------------
Command := Split(Data,'|',1);
Delete(Data,1,Length(Command)+1);
//<<<<<-----------------------------Command Routine--------------------------------------------->>>>>
if Command = 'FileTransfer' then begin
TFileTransfer(SocketData.Form).ParseData(Socket,Data);
end;
if Command = 'FileTransferSocket' then begin
H := strtoint(Data);
SocketData.Form := TFileTransfer(FindForm(H));
if TFileTransfer(SocketData.Form).NewSocket <> nil then begin
Socket.Close;
Exit;
end;
SocketData.MainSocket := TFileTransfer(SocketData.Form).MainSocket;
TFileTransfer(SocketData.Form).NewSocket := Socket;
TFileTransfer(SocketData.Form).SetUpConnection(Socket);
end;
//<<<<<-----------------------------Command Routine Ende---------------------------------------->>>>>
if Length(SocketData.Data) > 0 then begin
Application.ProcessMessages;
ParseData(Socket);
end;
end;
Pascal
|
|
Zitat
|