INDY 问题:不能多线程接收stream?(100分)

  • 主题发起人 主题发起人 liqianlong
  • 开始时间 开始时间
L

liqianlong

Unregistered / Unconfirmed
GUEST, unregistred user!
用多个TCPClicent向TCPServer发送stream,发现不能同时接收,要排队!!一个一个来。

怎么回事?不是集成了多线程管理吗?
 
用IdTcpClient和IdTcpServer是可以多线程收发Stream的。
Client用一个线程负责收发,可以使用Idthreadcomponent控件
procedure TForm.TcpClientThreadRun(Sender: TIdCustomThreadComponent);
var
Adata:TmemoryStream;
begin
AData:=TmemoryStream.Create;
if assigned(Adata) then begin
if Tcpclient.Connected then begin
Adata.Clear;
try
// ....Adata.write(.....)
Adata.Position:=0;
tcpclient.WriteStream(Adata,true,true.0);
tcpclient.ReadStream(Adata,-1,false);
//.......注意ReadStream的参数-1表示接收所有数据(他会先接收数据包的大小)
//.......发送用WriteStream(Adata,true,true,0);
//.......注意处理数据前最好让Adata.Position:=0;
except
on e:exception do begin
tcpclient.Disconnect;
end;
end;
end else begin
try
Tcpclient.Connect(1000);
except
end;
end;
end;
Adata.Free;
end;
服务端在IdTcpServer的Execute里面处理
procedure TForm.TCPServerExecute(AThread: TIdPeerThread);
var
Adata:TmemoryStream;
begin
Adata:=TmemoryStream.Create;
try
adata.Clear;
Athread.Connection.ReadStream(Adata,-1,false);
Adata.position:=0;
Athread.connection.writestream(Adata,true,true,0);
//.....发送用Write(Adata,true,true,0)
//...注意读取数据前最好让Adata.Position:=0;
except
Athread.Connection.Disconnect;
end;
Adata.Free;
end;
 
我马上试试看!
 
看起来,好像是多线程从服务器(TCPServer)发送到客户端(TCPClicent),但我需要的是相反的,多个客户端 同时 向 同一个 服务器发送大文件,服务器端同时接受。。

不知道是不是稍微改一下即可,我要试试看。。。劳驾 qlj 兄也帮我看看
 
不能多线程同时读写一个流,如果要读写要保护这个流的相关操作,这样就串行操作
和单线程区别不大[:D]
 
为什么说是同一个流?

服务器端接收到的流我将作不同的处理(如:保存不同的文件)。

问题是:如何同时接收(不另写代码拆分流)。像ftp服务器,支持多用户同时向自己传送
文件(流)。
 
上面的代码是从客户端发给服务端的,流程是:
1。客户端发给服务端数据流
TCPCLIENT。WRITESTREAM;
2。服务端接收来自客户端的数据流
ATHREAD。CONNECTION。READSTREAM
3。服务端发送处理过的数据流给客户端
ATHREAD。CONNECTION。WRITESTREAM
4。客户端接收服务端返回的数据流
TCPCLIENT。READSTREAM

整个处理是多线程+阻塞模式的简单。
 
Idthreadcomponent怎么用?是不是几个线程就需要几个Idthreadcomponent?
 
接受答案了.
 
后退
顶部