Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.10;
Скачать: CL | DM;

Вниз

И опять эти сокеты...   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
1-30385
Demon_mhm
2003-03-28 20:23
2003.04.10
Как работать с TListWiew


1-30432
Songoku
2003-03-30 16:01
2003.04.10
Помогите!!! Если я создал несколько RadioButton как мне создать..


1-30447
KSergey
2003-03-31 11:30
2003.04.10
Различия при компиляции в Win2k и Win98


14-30522
RDA
2003-03-23 21:37
2003.04.10
Для жителей Украины работающих с казначейством


1-30387
mixamixa
2003-03-30 06:10
2003.04.10
Как в StringGrid удалить строку ячеек?