Главная страница
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.026 c
14-30549
MaxVolkin
2003-03-24 18:21
2003.04.10
Где взять?


3-30225
DenKop
2003-03-17 23:07
2003.04.10
Русский текст в IB6.5


1-30379
Filmax
2003-03-29 15:10
2003.04.10
Вопрос по строкам


1-30373
Петров Денис
2003-03-29 12:19
2003.04.10
Office-подобный MDI-интерфейс


9-30206
HellTrooper
2002-11-10 13:30
2003.04.10
2D карта