【发布时间】:2015-01-02 22:28:33
【问题描述】:
我又来了……现在我正在尝试玩流媒体。我的目标是使用 TCPServer 向 TCPClient 请求一个流并正确接收它。这是我没有成功的尝试:
procedure TfrmMain.TCPServerExecute(AContext: TIdContext);
var
SCmd: string;
Client: TClient;
LQueue: TStringList;
WQueue: TStringList;
Stream: TMemoryStream;
begin
Client := TClient(AContext.Data);
// Send Cmd
LQueue := nil;
try
WQueue := Client.QMsg.Lock;
try
if (WQueue.Count > 0) then
begin
LQueue := TStringList.Create;
LQueue.Assign(WQueue);
WQueue.Clear;
end;
finally
Client.QMsg.Unlock;
end;
if (LQueue <> nil) then
begin
SCmd := LQueue[0];
AContext.Connection.IOHandler.Write(SCmd);
end;
finally
LQueue.Free;
end;
// Receive Data
if AContext.Connection.IOHandler.InputBufferIsEmpty then
begin
if not AContext.Connection.IOHandler.CheckForDataOnSource(100) then Exit;
AContext.Connection.IOHandler.CheckForDisconnect;
end;
if (SCmd = 'sendfile') then
begin
Stream := TMemoryStream.Create;
try
AContext.Connection.IOHandler.ReadStream(Stream, -1);
Stream.Position := 0;
Stream.SaveToFile(ExtractFilePath(Application.ExeName) + 'test.zip');
finally
Stream.Free;
end;
end;
end;
在客户端,我创建了一个用于监听和处理命令的线程。代码如下:
procedure TClientProc.Execute;
begin
TCPClient := TIdTCPClient.Create(nil);
while (not Terminated) do
begin
with TCPClient do
begin
if (Connected) then
try
FCmd := Trim(IOHandler.ReadLn);
if (FCmd <> '') then Synchronize(CommandProc);
except
end else
begin
if (FCnt >= FInt) then
try
ConnectTimeout := 4000;
Port := StrToInt(FPort);
Host := FHost;
Connect;
except
FCnt := 0;
end else
begin
Inc(FCnt);
end;
end;
Sleep(1000);
end;
end;
TCPClient.Disconnect;
TCPClient.Free;
end;
Procedure TClientProc.CommandProc;
var
Stream: TMemoryStream;
begin
if FCmd = 'sendfile' then
begin
Stream := TMemoryStream.Create;
try
Stream.LoadFromFile(ExtractFilePath(Application.ExeName) + 'test.zip');
Stream.Position := 0;
TCPClient.IOHandler.Write(Stream, 0, True);
finally
Stream.Free;
end;
end;
end;
请问,我做错了什么?
顺便说一句,新年快乐!! :)
【问题讨论】:
-
@预期结果是什么?相反会发生什么?有任何错误信息吗?数据已收到但已损坏?您需要让我们更多地了解这并不能满足您的需求。
-
@JerryDodge,这是一个奇怪的行为,服务器收到流时断开连接......预期的结果是接收文件并保存。