全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1730
推到 Plurk!
推到 Facebook!

delphi7 idtcpserver做屏幕监视问题

答題得分者是:aftcast
yztszrj
一般會員


發表:1
回覆:1
積分:0
註冊:2014-08-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-08-30 22:33:22 IP:112.84.xxx.xxx 訂閱


用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]
編輯記錄
yztszrj 重新編輯於 2014-08-30 22:41:17, 註解 無‧
yztszrj 重新編輯於 2014-08-30 22:46:17, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-08-31 14:51:23 IP:114.32.xxx.xxx 訂閱
依照你的描述与错误的回报,我认为应该与你的程序无太大关系。
建议如下的测试观察:
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-09-08 20:10:00 IP:112.84.xxx.xxx 訂閱
谢谢楼上提醒,问题得以解决
系統時間:2017-10-24 4:43:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!