Форум: "Сети";
Поиск по всему сайту: 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.02 c
1-9486            skywalker             2002-03-22 15:56  2002.04.04  
SetLength


1-9478            P.                    2002-03-25 18:39  2002.04.04  
GIF


14-9608           -=CrazyFish=-         2002-02-20 11:28  2002.04.04  
как бороться с админом?


1-9557            olookin               2002-03-24 15:21  2002.04.04  
TChart иногда ведет себя странно


1-9430            Aleksandr             2002-03-22 13:08  2002.04.04  
Как обрезать файловый поток?