delphi7 idtcpserver做屏幕监视问题 |
答題得分者是:aftcast
|
yztszrj
一般會員 ![]() ![]() 發表:1 回覆:1 積分:0 註冊:2014-08-13 發送簡訊給我 |
用delphi自带的indy9中的idtcpserver做屏幕监视教师端,用idtcpclient做学生端。学生端采用mirro_driver实时捕获屏幕并发送给教师端。用10台以下学生端连接都正常,教师端也能正常显示学生端屏幕监视图像。当学生端达到30以上时,教师端就无法显示学生端的屏幕监视图像了,会报错:“socket error # 10054 connection reset by peer.” idtcpserver是支持多线程的,为什么只连了30几台机器就会出现这种情况呢。附教师端idtcpserver代码,请教哪里有问题? [code delphi] procedure Tvserver.IdTCPServerExecute(AThread: TIdPeerThread); var MyStream,imgstream: TMemoryStream; MyRect:TRect; mybmpp:tbitmap; ipid:integer; iLeft, iTop, iRight, iBottom, iSize: integer; ds: TDecompressionStream; //解压流 count: Integer; //接受文件压缩前的大小 begin Mybmpp := Tbitmap.Create ; MyStream := TMemoryStream.Create; imgstream := TMemoryStream.Create; //读取编号、图像尺寸、大小 ipid := AThread.Connection.ReadInteger;//接收客户端编号,寻找对应的图像控件进行显示 iLeft := AThread.Connection.ReadInteger; iTop := AThread.Connection.ReadInteger; iRight := AThread.Connection.ReadInteger; iBottom := AThread.Connection.ReadInteger; iSize := AThread.Connection.ReadInteger; MyStream.Clear; AThread.Connection.ReadStream(MyStream, iSize); MyStream.Position := 0; MyStream.ReadBuffer(count,SizeOf(count));//读出文件压缩前的大小 imgStream.SetSize(count);//准备好要接收的流, 并设置需要的大小 ds := TDecompressionStream.Create(MyStream);//解压,参数是要解压的流 ds.Read(imgStream.Memory^, count);//把解压后的数据读出存放到已准备好接收的流 imgstream.Position:=0; ds.Free;//释放 MyStream.clear;//清空源流 mystream.Free; Mybmpp.LoadFromStream(imgStream); SetRect(MyRect, iLeft, iTop, iRight, iBottom);//设置新的区域 im[ipid].Canvas.Lock;//im[ipid]是在formcreate时根据数据库数据动态创建的图像控件 im[ipid].Canvas.StretchDraw(myrect, mybmpp); InvalidateRect(Handle, @MyRect, FALSE); //刷新 im[ipid].Canvas.Unlock; end; [/code] |
aftcast
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
依照你的描述与错误的回报,我认为应该与你的程序无太大关系。
建议如下的测试观察: 1/ 当连线超过10个以上时,每增加一个连线,观察server的cpu与io的busy情形,假始30个线程cpu或io都满 (因为你传的是影像),那就没办法,是server硬体的极限。 2/ 可调整client上的send,connection,等timeout拉长看看。 3/ 依那错误代码,许多时候也有可能是网关等硬体设备出问题,听说将client设固定ip而不用dhcp可能可以解一小部份的情形。保持client与server的畅通很重要。可使用ping -t -l 1350 xxxxx 看连线的情形,尤其是当连线到了瓶颈时。 虽然indy采多线程,但它一个连线一个线,使得它无法规模化。良好可具规模的server应该是用非同步socket的方式,但indy不是。然而,30条连线原则上indy是承受的了的。 以上供参考除错! 希望有一点点帮助。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
yztszrj
一般會員 ![]() ![]() 發表:1 回覆:1 積分:0 註冊:2014-08-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |