如何分割文本文件的filestream写到record中,通过socketbuf发送出去?(200分)

  • 主题发起人 主题发起人 freefirez
  • 开始时间 开始时间
F

freefirez

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义:
SDATA:record
mark:string[5]; //标志是第一包,还是最后一个包。
length:integer; //是fdata的实际大小(可能最后一个包的fdata不足1000byte。)
fdata:array[0..1000] of byte; //filestream被分割写入的数据。
end;

1.如何将filestream如何能有序的分割写入到fdata中,通过socketbuf发送出去。
2.接受到,如何在合并写入文件呢。

都是文本文件(<1mb)的分割,不需设置线程。
 
www.source520.com 站长必进 2万源代码电子经典书狂下载
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3375090
 
这里是:
发标志和包长度,接着直接发整个流就可以.
 
一般一个数据包在4K左右,你应该把filestream每次READ进4K,一次一次的发出去,
mark用一个枚举类型(是第一个,中间的包,还是最后一个包),再加一个中间包的
顺序字段,到了对方再接起来.
 
谢谢大家。
我就是不知道如何每次把filestream每次read进fdata,如何控制read filestream的位置。
请给个代码以供参考。
 
filestream.read(fdata,sizeof(SDATA));
 
不熟,最好用Delphi里面的SendStream;
function TCustomWinSocket.SendStreamPiece: Boolean;
var
Buffer: array[0..4095] of Byte;
StartPos: Integer;
AmountInBuf: Integer;
AmountSent: Integer;
ErrorCode: Integer;

procedure DropStream;
begin
if FDropAfterSend then Disconnect(FSocket);
FDropAfterSend := False;
FSendStream.Free;
FSendStream := nil;
end;

begin
Lock;
try
Result := False;
if FSendStream <> nil then
begin
if (FSocket = INVALID_SOCKET) or (not FConnected) then exit;
while True do
begin
StartPos := FSendStream.Position;
AmountInBuf := FSendStream.Read(Buffer, SizeOf(Buffer));
if AmountInBuf > 0 then
begin
AmountSent := send(FSocket, Buffer, AmountInBuf, 0);
if AmountSent = SOCKET_ERROR then
begin
ErrorCode := WSAGetLastError;
if ErrorCode <> WSAEWOULDBLOCK then
begin
Error(Self, eeSend, ErrorCode);
Disconnect(FSocket);
DropStream;
if FAsyncStyles <> [] then Abort;
Break;
end else
begin
FSendStream.Position := StartPos;
Break;
end;
end else if AmountInBuf > AmountSent then
FSendStream.Position := StartPos + AmountSent
else if FSendStream.Position = FSendStream.Size then
begin
DropStream;
Break;
end;
end else
begin
DropStream;
Break;
end;
end;
Result := True;
end;
finally
Unlock;
end;
end;

===========
自己写也没有什么不好理解的。
//没有经过测试,
procedure TForm1.Button1Click(Sender: TObject);
var
ReadNum: Integer;
FileStream: TFileStream;
Buf: array[0..4095] of Char;
begin
if not dlgOpen1.Execute then Exit;
FileStream := TFileStream.Create(FileName, fmOpenReadWrite);
try
repeat
try //流在读取到数据后自动将position移到当前+读取到的位置
//清空缓冲
FillChar(Buf, SizeOf(Buf), #0);
//读取文件数据到缓冲
ReadNum := FileStream.Read(Buf, SizeOf(Buf));
//如读到的长度大于0就发送出去。
if ReadNum > 0 then
ServerSocket1.Socket.SendBuf(Buf, ReadNum);
except on E: Exception do
begin
ShowMessage(E.Message);
Break;
end;
end;
until FileStream.Position = FileStream.Size;

finally
//释放stream
FileStream.Free;
end;


end;
 
多人接受答案了。
 
后退
顶部