29-03-2016, 08:53 PM
(آخر تعديل لهذه المشاركة: 30-03-2016, 05:48 AM بواسطة محمد عبد العزيز.)
السلام عليكم ورحمة الله وبركاته ....
ليس لدي خبرة واسعة مع لغة الدلفي ولدي بعض المشاكل في التعامل مع مكونات السوكيت في DELPHI 10 ,Tserversocket,Tclientsoket
وساقوم بتفصيل ماأنجزته والمشاكل الحالية والمطلوب للتوضيح أكثر ..
المنجز .
Server side . send file stream to all clients may connected .
procedure TServer.btnsendfileClick(Sender: TObject);
var
ms: TFileStream;
size: Integer;
FileName: array [0..255] of char;
i,total:integer;
begin
total:=SKserver.Socket.ActiveConnections;
if total=0 then Exit;
if OpenDialog1.Execute then
begin
ms:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
ms.Position:= 0;
Size:= MS.Size;
try
for i:=0 to total-1 do
begin
SKserver.Socket.Connections[i].SendBuf(Size,SizeOf(Size));
StrPLCopy(FileName, ExtractFileName(OpenDialog1.FileName), High(FileName));
SKserver.Socket.Connections[i].SendBuf(FileName, SizeOf(FileName));
SKserver.Socket.Connections[i].SendStream(ms);
memstatues.Lines.Add('Waiting Client'+SKserver.Socket.Connections[i].RemoteAddress+'to recive');
end;
except
ms.Size:=0;
end;
end;
ms.Size:=0;
end;
------------------------------------------------
client side >> recive from server
procedure TClient.skclientRead(Sender: TObject; Socket: TCustomWinSocket);
var
BytesReceived: Longint;
CopyBuffer: Pointer; { buffer for copying }
ChunkSize: Integer;
TempSize: Integer;
FileName: array [0..255] of char;
pro:integer;
const
MaxChunkSize: Longint =8192; { copy in 8K chunks }
begin
If FSize=0 then
begin
If Socket.ReceiveLength>SizeOf(TempSize) then
begin
Socket.ReceiveBuf(TempSize,SizeOf(TempSize));
Socket.ReceiveBuf(FileName, sizeOf(FileName));
SaveDialog1.FileName:= FileName;
Stream:=TMemoryStream.Create;
Stream.SetSize(TempSize);
Stream.Position:=0;
FSize:= TempSize;
writing:= True;
End;
End;
If (FSize>0) and (writing) then
begin
GetMem(CopyBuffer, MaxChunkSize);
While Socket.ReceiveLength>0 do
Begin
ChunkSize:= Socket.ReceiveLength;
If ChunkSize > MaxChunkSize then ChunkSize:= MaxChunkSize;
BytesReceived:= Socket.ReceiveBuf(CopyBuffer^,ChunkSize);
Stream.Write(CopyBuffer^, BytesReceived); { ...write chunk }
memstatues.Lines.Add('Recived :'+IntToStr(BytesReceived)+' byte');
Dec(FSize,BytesReceived);
End;
FreeMem(CopyBuffer, MaxChunkSize);
If FSize=0 then
If SaveDialog1.Execute then
begin
If FileExists(SaveDialog1.Filename) then
DeleteFile(SaveDialog1.Filename);
Stream.SaveToFile(SaveDialog1.Filename);
Socket.SendText('File received!');
Stream.SetSize(0);
FSize:= 0;
Writing:= False;
End;
End;
end;
-------------------------------------------------
المشاكل يتم الأرسال والأستقبال مع رسائل خطأ رغم إتمام العملية بنجاح , وغالبا رسائل خطأ في الميموري
message 1 > system erroe .code 6 the handle is invalid
بمجرد أنهاء الأرسال من السيرفر
message 2 > out of memort
بمجرد التخزين في العميل
......
المطلوب
حل هذه المشاكل وكيفية التفريق بين رسائل النصية والملفات المرسلة ...
skclient.Socket.SendText
Socket.ReceiveLength
لاتعمل بشكل واضح للتفريق بين الاثنين
ليس لدي خبرة واسعة مع لغة الدلفي ولدي بعض المشاكل في التعامل مع مكونات السوكيت في DELPHI 10 ,Tserversocket,Tclientsoket
وساقوم بتفصيل ماأنجزته والمشاكل الحالية والمطلوب للتوضيح أكثر ..
المنجز .
Server side . send file stream to all clients may connected .
procedure TServer.btnsendfileClick(Sender: TObject);
var
ms: TFileStream;
size: Integer;
FileName: array [0..255] of char;
i,total:integer;
begin
total:=SKserver.Socket.ActiveConnections;
if total=0 then Exit;
if OpenDialog1.Execute then
begin
ms:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
ms.Position:= 0;
Size:= MS.Size;
try
for i:=0 to total-1 do
begin
SKserver.Socket.Connections[i].SendBuf(Size,SizeOf(Size));
StrPLCopy(FileName, ExtractFileName(OpenDialog1.FileName), High(FileName));
SKserver.Socket.Connections[i].SendBuf(FileName, SizeOf(FileName));
SKserver.Socket.Connections[i].SendStream(ms);
memstatues.Lines.Add('Waiting Client'+SKserver.Socket.Connections[i].RemoteAddress+'to recive');
end;
except
ms.Size:=0;
end;
end;
ms.Size:=0;
end;
------------------------------------------------
client side >> recive from server
procedure TClient.skclientRead(Sender: TObject; Socket: TCustomWinSocket);
var
BytesReceived: Longint;
CopyBuffer: Pointer; { buffer for copying }
ChunkSize: Integer;
TempSize: Integer;
FileName: array [0..255] of char;
pro:integer;
const
MaxChunkSize: Longint =8192; { copy in 8K chunks }
begin
If FSize=0 then
begin
If Socket.ReceiveLength>SizeOf(TempSize) then
begin
Socket.ReceiveBuf(TempSize,SizeOf(TempSize));
Socket.ReceiveBuf(FileName, sizeOf(FileName));
SaveDialog1.FileName:= FileName;
Stream:=TMemoryStream.Create;
Stream.SetSize(TempSize);
Stream.Position:=0;
FSize:= TempSize;
writing:= True;
End;
End;
If (FSize>0) and (writing) then
begin
GetMem(CopyBuffer, MaxChunkSize);
While Socket.ReceiveLength>0 do
Begin
ChunkSize:= Socket.ReceiveLength;
If ChunkSize > MaxChunkSize then ChunkSize:= MaxChunkSize;
BytesReceived:= Socket.ReceiveBuf(CopyBuffer^,ChunkSize);
Stream.Write(CopyBuffer^, BytesReceived); { ...write chunk }
memstatues.Lines.Add('Recived :'+IntToStr(BytesReceived)+' byte');
Dec(FSize,BytesReceived);
End;
FreeMem(CopyBuffer, MaxChunkSize);
If FSize=0 then
If SaveDialog1.Execute then
begin
If FileExists(SaveDialog1.Filename) then
DeleteFile(SaveDialog1.Filename);
Stream.SaveToFile(SaveDialog1.Filename);
Socket.SendText('File received!');
Stream.SetSize(0);
FSize:= 0;
Writing:= False;
End;
End;
end;
-------------------------------------------------
المشاكل يتم الأرسال والأستقبال مع رسائل خطأ رغم إتمام العملية بنجاح , وغالبا رسائل خطأ في الميموري
message 1 > system erroe .code 6 the handle is invalid
بمجرد أنهاء الأرسال من السيرفر
message 2 > out of memort
بمجرد التخزين في العميل
......
المطلوب
حل هذه المشاكل وكيفية التفريق بين رسائل النصية والملفات المرسلة ...
skclient.Socket.SendText
Socket.ReceiveLength
لاتعمل بشكل واضح للتفريق بين الاثنين

