Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];




Вниз

Событие ClientSocketRead 


SemFLY   (2002-01-21 19:31) [0]

Проблема у меня такая:
В это событие приходит поток с данными и просто текст от сервера. Как мне отделить поток от текста ?
Я прорбовал посылать текст и префиксом фильтровать это, с текстом это выходит, но как послать поток с префиксом, не знаю.

Спасибо !



Digitman   (2002-01-22 08:54) [1]

точно так же.

посылаешь :
1. Префикс, предваряющий поток
2. Размер потока
3. Собственно поток

принимаешь :
1. Префикс. Если это - префикс потока, то
2. Размер потока. Создаешь экз-р потока с размером, равным принятому
Stream:= TMemoryStream.Create;
Stream.Size:= ExpectedStreamSize
3. Собственно поток (ClientSocket.ReceiveBuf(Stream.Memory^, ExpectedStreamSize))



SemFLY   (2002-01-22 19:21) [2]

Digitman Вот вся оба оба искходника клиент и сервер посмотри может я тут ошибаюсь где-то

Сервер ( посылает )

begin
try
DataFile := TFileStream.Create(FuncParam,fmOpenRead);
Size := DataFile.Size;
ServerSocket1.Socket.Connections[0].SendText("01");
ServerSocket1.Socket.Connections[0].SendBuf(Size,4);
ServerSocket1.Socket.Connections[0].SendStream(DataFile);
except
DataFile.Free;
end;
end;

- - -

Клиент ( принимает )

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Count, ReceiveSize : Cardinal;
Buffer : Array [0..8191] of byte;
command, FuncParam : String;
cn, I, SizeStream : Integer;
DataFile : TMemoryStream;
begin
command := Socket.ReceiveText; |
cn := StrToInt(Copy(command,1,2)); | - тут фильтраци префикса(работает 100%)
FuncParam := Copy(command,3,I); |
case cn of
01 : begin
SizeStream := Socket.ReceiveBuf(ReceiveSize,4);
Count := Socket.ReceiveLength;
Socket.ReceiveBuf(Buffer,Count);
DataFile:= TMemoryStream.Create;
DataFile.Size := SizeStream;
DataFile.Seek(0,SoFromEnd);
DataFile.WriteBuffer(Buffer,Count);
DataFile.Seek(0,SOFromBeginning);
Form2.Memo1.Lines.LoadFromStream(DataFile);
DataFile.Clear;
end;
end;



Digitman   (2002-01-23 09:56) [3]

Примерно так это должно выглядеть :

1.Сервер ( посылает )


var
DataFile: TMemoryStream;
Command: byte;
FuncParam: string;
FuncParamSize: Integer;
DataFile: TMemoryStream;
p: Pointer;
begin
FuncParam:= "dev:\fullpath\datafile.ext";
FuncParamSize:= Length(FuncParam);
Command:= 1;
DataFile := TMemoryStream.Create;

with ServerSocket1.Socket, DataFile do
try
DataFile.LoadFromFile(FuncParam);
Size := DataFile.Size;
Connections[0].SendBuf(Command, SizeOf(Command));
Connections[0].SendBuf(FuncParamSize, SizeOf(FuncParamSize));
if FuncParamSize > 0 then
Connections[0].SendBuf(@FuncParam[1], SizeOf(FuncParamSize));
Connections[0].SendBuf(Size, SizeOf(Size));
Connections[0].SendBuf(Memory^, Size);
finally
DataFile.Free;
end;
end;


2.Клиент ( принимает )


type

ESocketReadError = class(Exception)
end;

function ReceiveDataBlock(Socket: TCustomWinSocket; Buf: Pointer; ExpextedBlockSize: Integer): Boolean;
var
BytesRead: Integer;
begin
Result:= False;
with Socket do
while ExpextedBlockSize > 0 do begin
BytesRead := ReceiveBuf(Buf^, ExpextedBlockSize);
if BytesRead > 0 then begin
Dec(ExpextedBlockSize, BytesRead);
Inc(Integer(Buf), BytesRead);
end else
Exit;
end;
Result := True;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
FuncParam: string;
FuncParamSize: Integer;
DataFile: TMemoryStream;
DataFileSize: Integer;
begin
try
if not ReceiveDataBlock(Socket, @Command, SizeOf(Command)) then
raise ESocketReadError.Create("Ошибка чтения команды");
case Command of
01:
begin
if not ReceiveDataBlock(Socket, @FuncParamSize, SizeOf(FuncParamSize)) then
raise ESocketReadError.Create("Ошибка чтения размера параметра");
SetLength(FuncParam, FuncParamSize);
if FuncParamSize > 0 then
if not ReceiveDataBlock(Socket, @FuncParam[1], FuncParamSize) then
raise ESocketReadError.Create("Ошибка чтения параметра команды");
if not ReceiveDataBlock(Socket, @DataFileSize, SizeOf(DataFileSize)) then
raise ESocketReadError.Create("Ошибка чтения размера файлового потока");
DataFile:= TMemoryStream.Create;
try
DataFile.Size := DataFileSize;
if not ReceiveDataBlock(Socket, DataFile.Memory, DataFileSize) then
raise ESocketReadError.Create("Ошибка чтения файлового потока");
DataFile.SaveToFile(FuncParam);
Form2.Memo1.Lines.LoadFromStream(DataFile);
finally
DataFile.Free;
end;
end;
else
raise ESocketReadError.Create("Неизвестная команда");
end;
except
Socket.Disconnect;
raise;
end;
end;




SemFLY   (2002-01-23 21:09) [4]

Спасибо ! :)




Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.031 c
3-9381            pusrg                 2002-03-11 20:48  2002.04.04  
Сортировка кешированной таблицы


1-9462            Creecker Dikar        2002-03-24 13:43  2002.04.04  
Как можно сохранить иконку из компонента Image в BMP файл?


14-9623           savva                 2002-02-22 10:06  2002.04.04  
Вопрос к франко говорящему населению сайта (и не только:)). Точнее просьба :))


1-9532            Ирина                 2002-03-22 15:35  2002.04.04  
Метод WriteBinaryData


4-9674            Ewgenij               2002-02-04 23:26  2002.04.04  
CreateDesktop