проблема передачи файлов через сокеты не могу передать больше 8кб
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, jpeg, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Memo1: TMemo;
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure Button3Click(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
buffer1:^integer;
buffer2:^integer;
Output:TmemoryStream;
InPut:TmemoryStream;
Size:Integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
serversocket1.Port:=1001;
serversocket1.Active:=true;
serversocket1.Open;
memo1.Lines.Add('Ñåðâåð Àêòèâåí');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Port:=1001;
clientsocket1.Address:='192.168.0.2';
clientsocket1.Active:=true;
memo1.Lines.Add('Êëèåíò àêòâåí');
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
clientsocket1.Open;
memo1.Lines.Add('Êëèåíò ïîäêëþ÷èëñÿ');
end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.Add('Ñåðâåð: êëèåíò ïîäêëþ÷èëñÿ');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
clientsocket1.Socket.SendText('send');
memo1.Lines.Add('Çàïðîñ îòïðàâëåí send');
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
input:=tmemorystream.Create;
input.Position:=0;
size:=socket.ReceiveLength;
getmem(buffer2, size);
socket.ReceiveBuf(buffer2^,size);
input.Write(buffer2^, size);
freemem(buffer2);
begin
input.Position:=0;
memo1.Lines.Add(inttostr(socket.ReceiveLength));
input.SaveToFile('d:\1.jpg');
memo1.Lines.Add('Ôàéë ïðèíÿò');
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
begin
Output:=Tmemorystream.Create;
output.Position:=0;
image1.Picture.Graphic.SaveToStream(output);
i:=output.Size;
memo1.Lines.add(inttostr(i));
getmem(buffer1,i);
output.Position:=0;
begin
output.Read(buffer1^,i);
serversocket1.Socket.Connections[0].SendBuf(buffer1^,i);
freemem(buffer1);
end;
memo1.Lines.Add('Ôàéë îòïðàâëåí');
end;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.Add(socket.ReceiveText);
end;
end.
Цитата:
Originally posted by Cameron
Вот программа передачи файлов через сокеты но она передаёт не больше 8 кб помогите сделать так что бы передавать любой обьём.
Вот программа передачи файлов через сокеты но она передаёт не больше 8 кб помогите сделать так что бы передавать любой обьём.
Сокет передает сколько угодно, просто размер пакета данных, которые можно передать за раз, у него ограничено 8 кб. Обработчик ClientRead в любом случае вызовется столько раз, сколько данных было передано, но не больше 8 кб за один вызов. Для решения этой проблемы можно перед пердачей файла посылать его размер, тогда на принимающей стороне всегда известно, сколько читать из сокета.
Ну или посмотреть в сторону других компонентов (Indy, например)...