INDY 并发包处理出错 求教

yuyuhaso 2010-03-02 11:13:12
本人在使用indy10的时候出现了一些莫名的状况
两个客户端需要相互通讯,互相通讯时的数据并发量非常大,以下的RAR包中是我模拟的一个环境
SERVER是服务器:服务器收到包以后转发给服务器中的其他用户
CLIENT模拟了两个客户端,按钮1通知TCP1发包给服务器,按钮2通知TCP2发包给服务器
http://yuyuhaso.ww.84g.com/multitcp.rar
轮流两个按钮给服务器加压,大概3轮点击,大概相当于每个客户端使用3个线程发送数据,然后整个服务就DOWN了
不知道我这样做是否有问题,如果有好的解决方案希望有大侠能够帮忙指出来
...全文
139 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuyuhaso 2010-03-03
  • 打赏
  • 举报
回复
而且也不能从根本上解决问题
yuyuhaso 2010-03-03
  • 打赏
  • 举报
回复
sleep会严重影响效率滴
SQLDebug_Fan 2010-03-03
  • 打赏
  • 举报
回复
是不是你的客户端发的数据量太多了,SLEEP一下试试
yuyuhaso 2010-03-03
  • 打赏
  • 举报
回复
但是我的一个简单的需求他老人家满足不了啊,并发一大就挂嘛
SQLDebug_Fan 2010-03-03
  • 打赏
  • 举报
回复
开发服务器的时候,要多调试,找找代码原因,及时发现瓶颈。
SQLDebug_Fan 2010-03-03
  • 打赏
  • 举报
回复
INDY是不会如此脆弱的,我用它开发的服务器商用了很久。
yuyuhaso 2010-03-03
  • 打赏
  • 举报
回复
我现在写的是一个类似于VPN的东西,客户端相互通讯的时候发包是随机的,而且有一定压力的,
我只是觉得indy不应该如此脆弱
yuyuhaso 2010-03-03
  • 打赏
  • 举报
回复
我刚刚测试过了,即便在服务器端这样写
i:=AContext.Connection.IOHandler.ReadLongInt(true);
assert(i<1230);
AContext.Connection.IOHandler.ReadStream(tmpstream,i,false);
tmpstream.Position:=0;
AContext.Connection.IOHandler.Write(tmpstream,tmpstream.Size,true);
也一样会有问题,也就是说不管IdTCPServer1.Contexts.LockList是否存对转发造成了多大的影响,只要是线程数一大就会有问题滴
SQLDebug_Fan 2010-03-03
  • 打赏
  • 举报
回复
你这种情况要定义服务端和客户端的协议,不能一味的发送数据,是不是客户端发送数据太快了,造成缓冲区爆了。
yuyuhaso 2010-03-03
  • 打赏
  • 举报
回复
我使用了一个LIST来存储各个用户的Acontext,这个例子里面没有写出来,但是结果是一样的,就是并发量一大服务器接收包就会有问题
我将服务器的接收修改了一下
i:=AContext.Connection.IOHandler.ReadLongInt(true);
assert(i<1600);//并发一大就会出现断言错误
AContext.Connection.IOHandler.ReadStream(tmpstream,i,false);
所以我判断有可能是InputBuffer缓冲区溢出,导致了在ReadLongInt的时候访问了错误的地址,但是如何解决呢?
SQLDebug_Fan 2010-03-03
  • 打赏
  • 举报
回复
TIdTCPServer的线程模型是分开的,也就是说一个客户端一个线程,因此contextList:=IdTCPServer1.Contexts.LockList是服务端的瓶颈,你可以在TCPClient连接和断开的时候获取列表。
wanglipo 2010-03-03
  • 打赏
  • 举报
回复
老兄。是报的内存溢出错误吧!
SQLDebug_Fan 2010-03-03
  • 打赏
  • 举报
回复
呵呵,恭喜兄弟。。。。。
yuyuhaso 2010-03-03
  • 打赏
  • 举报
回复
OK,已经找到了问题的原因了
IdTCPClient1.IOHandler.Write(stream,stream.Size,false);
这儿的WRITE方法并不是线程安全的,也就是说在WRITE的时候如果有其他线程也在WRITE就会导致数据错乱,所以要使用一个锁锁起来
感谢大家的关注结贴
SQLDebug_Fan 2010-03-03
  • 打赏
  • 举报
回复
现在需要的是找出问题的关键,是否协议有问题,还是客户端发送的数据超出服务器的承受范围了。
yuyuhaso 2010-03-03
  • 打赏
  • 举报
回复
我不需要知道SLEEP(1)的时候程序在干嘛
你可知道一个网络转发程序的1毫秒延时意味着你的产品被淘汰
dd_zhouqian 2010-03-03
  • 打赏
  • 举报
回复
引用 10 楼 yuyuhaso 的回复:
sleep会严重影响效率滴

不会吧,sleep是在做啥,楼主应该去找些资料看看
SQLDebug_Fan 2010-03-03
  • 打赏
  • 举报
回复
还是调试,我原来也碰到过一次INDY出错,我调试了2天终于解决了,多看看,把程序在脑子里多跑几遍,用排除法排除不会出错的代码,找到代码瓶颈的关键地方。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧