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

Вниз

Событие 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]

Спасибо ! :)




Страницы: 1 вся ветка

Текущий архив: 2002.04.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
14-9612
vopros
2002-02-21 15:55
2002.04.04
Кто посоветует как провести день рождения в Питере, либо если от места не зависит ваще как провести?


3-9363
Berk
2002-03-11 17:30
2002.04.04
Хранение графических изображений в Access


14-9647
Aleks1
2002-02-25 03:30
2002.04.04
Климат в Москве


1-9487
-=GaLaN=-
2002-03-23 19:19
2002.04.04
Потеря фокуса формой


1-9457
andr
2002-03-25 14:14
2002.04.04
завершение работы WinExec