。。。。。。。。。。 (100分)

  • 主题发起人 陈一蛟
  • 开始时间
完全赞同张大侠!异步消息的处理就是面向事件的编程,而阻塞方式还是沿用陈旧的面向过程
方式的编程,异步是大势所趋,短暂的逻辑上不适应换来的是效率的极大提高!!
 
再顶吧:)
 
倒啊~~~~~~~~
indy组件不都是阻塞的吗,那为什么大家还一致推崇indy组件呢?
都说TClientSocket不好呢?
希望大侠们能给我一个明确的指引,让我不至于在迷惑,尽走弯路,谢谢!!!
 
。。。。。。。。。。。。。。。。
 
。。。。。。。。。。。。。。。。
 
其实要看应用的场合,其实阻塞和非阻塞各有优势。
不过好像有人发现完成端口的方式更高效,我没有在Delphi上是过完成端口,光看C完成端口
的代码,觉得理论上应该效率不错,有谁可以在Delphi上写出完成端口的代码?
 
。。。。。。。。。。。。。。。。。。。。
 
1。对于DXSock比IIS好的测试我认为是有问题的,为什么不让一个公开的机构测试了?
而且IIS具有很强大的2次开发能力,DXSock有吗?DXSock我看了他的代码,在www.playicq.com
有下的,主要是用的Select异步通讯,他的效率高的一个原因是他把很多TSocket
类的函数都做成静态函数,没有用继承那一套,当然他的继承也是有的。
//
2。对于异步多套接字出错的问题,是写代码的程序员没有控制好逻辑,只要控制好
逻辑,你会发现异步的好处,可以为所欲为了,可以用分散聚合I/O实现很多用阻塞
不好实现的功能,在写服务器方面,基本上我见过的好的都是用异步实现,当然用
完成端口是最好的办法,一般来说用少量的线程实现多连接(10000以上)的处理
但是编程复杂,我用Delphi写过一个完成端口的DEMO,测试可以用的,给过几个DFW
上的朋友,他们也在用这种技术写项目,还没有发现什么问题。
3。异步里效率最差的模式就是消息模式,也就是楼上楼上的那种模式。由于消息队列
开销太大,所以在服务器开发里这种模式最差的,但是对于客户端来说,差别不是太
大,而且可以很方便的和窗口通讯。
4。至于Indy的问题,是因为DELPHI自己带了这套控件,相对他的BUG比其他的要少一
些。而用DELPHI的一般不太研究地层方面,拖几个控件做完项目交差,所以都说Indy
好,这是事实,我有几个朋友用TIdTcpServer写服务器,人数一多,程序就经常退出,
可见Indy也是不太适合写服务器类的开发,他的强项是在支持SMTP,POP3,FTP客户部分
的开发,其他的做服务器类的控件都是用来自己娱乐的。

 
最近DFW上骂声越来越多,偶尔开个玩笑倒也罢了,但是有些人居然
搞起注册个***的爸爸之类的名字骂人就实在太过分了,真是令人伤
心。。。
 
张无忌:
可以把完成端口的程序的Demo发给我看看吗?
kgen@163.com
我在这个项目中要用
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1682567
 
。。。。。。。。。。。。。。。。。。
 
1,我没错,异步是指他的I/O操作是异步,这就是常说的异步,(比如send,recv,connect)
如果你用过select来写socket程序的话就知道,最开始就是要把一个socket至于非组塞模式
通过Select来查找是否有I/O操作完成,再去调用对应的操作
2,至于代码,我现在没法发到DFW上
3,DXSocket的高效,完成端口早就解决了,而且做的更好,他用固定的几个线程比如在
单CPU上,一般是只开4个线程来解决所有的连接问题。可以支持几万个连接,你说的3-4问题
都解决了。。。
4,不用完成端口,我也办法用单一线程解决多用户连接问题,初步测试也做完了,基本没问题

 
。。。。。。。。。。。。。。。。。。。。。。
 
1,我不知道你回复想说明什么,可能是我上面打错了一个字,”socket至于非组塞模式“
改成“socket置于非组塞模式”可能意思就清楚多了,不好意思。
 
我觉得你的TTCPBLockSocket用的效率上有问题。我是这么用的。虽然没有测试国速度。不过感觉很快。
//DOLoop是线程循环
procedure TRecvThread.DoLoop;
begin
if fSocket.LastError = 0 then
begin
if fSocket.CanRead(1000) then
begin
fRecvSize := fSocket.WaitingData;
if fRecvSize > fBufSize then
fRecvSize := fBufSize;
fSocket.RecvBuffer(fBuf, fRecvSize);
fQueue.Write(fbuf^, fRecvSize);
fOutFile.Write(fbuf^, fRecvSize);
end;
end
else begin
//网络连接中断,线程退出
{$IFDEF mmdebug}
DB_WriteStrLn(0, '4.RecvThread Broken...');
{$ENDIF}
QuitThread;
end;
end;

 
。。。。。。。。。。。。。。。。。。。
 
我的DoLoop是个循环。一次收不完可以多次收的。类似这样
procedure Execute;
begin
while ()
doLoop
end;
 
。。。。。。。。。。。。。。。。。。。。。。
 
我觉得用recvPacket效率肯定不好。你可以试试直接用.RecvBuffer来做一下。
抽空我来做个测试看看Synapse的速度是不是真的就那么低,因为我有个东西就是用它做的,感觉用起来很方便,如果真的那么差的话就太不争气了。
 
顶部