Форум: "Сети";
Текущий архив: 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]Спасибо ! :)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c