Форум: "Сети";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
ВнизИ опять эти сокеты... Найти похожие ветки
← →
Vampire (2003-02-18 05:47) [0]Блин...eсть такой исходник...
Клиент:
unit client;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Bevel1: TBevel;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
reciving: boolean;
datasize: integer;
data: tmemorystream;
public
{ Public declarations }
end;
var
Form1: TForm1;
dat: tmemorystream;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Active:=true;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
socket.SendText("send");
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var s,sl: string;
begin
s:=socket.ReceiveText;
if not Reciving then
begin
SetLength(sl,strlen(pchar(s))+1);
strlcopy(@sl[1],pchar(s), length(sl)-1);
datasize:=strToint(sl);
data:=TMemoryStream.create;
delete(s,1,length(sl));
reciving:=true;
end;
try
data.write(s[1],length(s));
if data.size =datasize then
begin
dat:=tmemorystream.Create;
data.position:=0;
dat.LoadFromStream(data);
dat.SaveToFile("c:\999.mp3");
data.free;
reciving:=false;
socket.Close;
end;
except
data.free;
end;
end;
end.
Сервер:
unit client;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Bevel1: TBevel;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
reciving: boolean;
datasize: integer;
data: tmemorystream;
public
{ Public declarations }
end;
var
Form1: TForm1;
dat: tmemorystream;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Active:=true;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
socket.SendText("send");
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var s,sl: string;
begin
s:=socket.ReceiveText;
if not Reciving then
begin
SetLength(sl,strlen(pchar(s))+1);
strlcopy(@sl[1],pchar(s), length(sl)-1);
datasize:=strToint(sl);
data:=TMemoryStream.create;
delete(s,1,length(sl));
reciving:=true;
end;
try
data.write(s[1],length(s));
if data.size =datasize then
begin
dat:=tmemorystream.Create;
data.position:=0;
dat.LoadFromStream(data);
dat.SaveToFile("c:\999.mp3");
data.free;
reciving:=false;
socket.Close;
end;
except
data.free;
end;
end;
end.
--------------------------
Файлы до 5мб летят не заметно быстро...
Но хочется качать и 20 и 100 метров :)
ТОлько после 5мб выдается ошибка или приложение зависает...
ВОт так...
ТИпа нехватает памяти или что-то в этом роде...
Как можно устронить???
И как можно при отправке резать файлы на куски и передавать?
Может кто приведет пример глядя на этот исходник?
← →
Digitman (2003-02-18 08:57) [1]где-то этот примитив я уже видел) ..
Не будет это работать как положено ! Код полностью переделывать нужно. Фактически, "камня на камне" не останется после "переделки"
Да, как минимум следует резать файл на "куски" и обрабатывать событие OnWrite()
← →
Vampire (2003-02-18 09:23) [2]Digitman ©
НУ может что посоветуешь? :)
Это понятно что на куски :) тока как? И если ли где пример использывания OnWrite? ...Именно его :)
← →
Digitman (2003-02-18 09:29) [3]А почитать для начала ? Ну хотя бы - описание ф-ции SendText() ! Ведь это - ф-ция ! И она возвращает опред.результат, в зависимости от которого нужно предпринимать те или иные дальн.действия
← →
Vampire (2003-02-18 10:00) [4]Digitman
Ты хочешь сказать что событие OnRead() вообще использывать не хорошо? т.е. событием OnRead() я не смогу перекачать большой файл? Мы же в этом исходнике описыаем размер потока, может его просто разбить и слать частями...так можно?
← →
Digitman (2003-02-18 10:40) [5]
> Ты хочешь сказать что событие OnRead() вообще использывать
> не хорошо?
При чем здесь OnRead() ? Это - событие приемника сообщения
А я - о передатчике сообщения тебе говорю. До приемника еще - как до Китая))..
Я хочу сказать, что в неблок.режиме без анализа результатов вызовов send-методов и обработки событий OnWrite() (необходимость обработки зависит ИМЕННО от результатов вызова send-метода) перередатчик как положено работать не будет - потери фрагментов в ходе интенсивных пересылок больших потоков данных тебе обеспечены.
Брось свой SendText (хэлп на него некорректен), вчитайся внимательно в SendBuf() и пользуй его в соответствии с описанием ф-ции
← →
Fredericco (2003-02-18 12:09) [6]http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1042188128&n=4
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c