用ICS实现网络通讯,headchen及各位精通Delphi网络编程的高手请进(300分)

  • 主题发起人 主题发起人 rocky_yan
  • 开始时间 开始时间
R

rocky_yan

Unregistered / Unconfirmed
GUEST, unregistred user!
我是一个新手,对delphi很有兴趣,也希望各位看到这个问题的大侠能够多多帮助我们
这些对delphi有兴趣的初学者,网络通讯是个很有意思的东西,大富翁里也有很多的
讨论,用ICS实现的也很多,但没有一篇文章给出一个实际的客户端和服务端通讯的
例子,看完这些讨论,我们仍然是云里雾里,希望各位大侠踊跃展开讨论,给我们一些
有实际价值的帮助
headchen大侠,在一篇关于Socket服务端的讨论中,我看到你说到用ICS来实现服
务端,你提到说不用一个连接对应一个线程,这个想法很好,最仅我也在试着写一个
网络通讯程序,刚好也是听大家的建议用ICS,可是我看了半天ICS的例子,始终不知
道怎样将不同的连接放到一个线程中去,ICS的那个MTSVR的例子看来看去也只能一个
连接对应一个线程,不知道你是怎么实现的,非常非常希望你的帮助,
我的email:yanzhimin@263.net
 
我也有点资料,[:)]
 
先谢过,我就在网上,可以先给我一些建议吗,我想用ICS做个传输文本的服务程序,希望
是多线程的,因为我想有可能是传输的查询语句,但ICS我不熟。。。
 
用多线程的话,自己用winsock写,更方便
 
ics的核心是基于Windows消息的,每创建一个Socket,Ics就会创建一个窗口用于处理与之
对应的网络消息。你可以在一个线程中创建多个Socket,他们各自工作互不干扰。不过
系统是串行处理他们的消息。你也可以一个Socket对应一个线程,系统可以并行处理他们
的消息。不过对于Windows而言线程超过一定数量性能就会急剧下降。所以你必须在两者
之间进行平衡,也就是使用多线程,不过是多个Socket对应一个线程。至于具体的数目就
是一个经验值了。
 
我选择ICS而不直接用api写是因为我认为一是自己对socket底层编程不是很熟,我花很
多功夫写的服务器可能还不如只接用ics写的好,二ics是一个比较成熟的控件,应该值
得信赖。
ics中我主要是不知道如何在一个线程内创建多个socket连接,它的例子是一个连接对应
一个线程
 
为什么大家对这种有实际作用问题不作解答和讨论呢,这个问题解决好了,基本上就
可以解决网络传输服务器的问题,对大家对新手都有很大的帮助
呼吁大家展开讨论
 
>>ics中我主要是不知道如何在一个线程内创建多个socket连接,它的例子是一个连接对应
一个线程
一个线程可以建立多个连接,用WSAEventSelect()就可以
 
我对WINSOCK2函数比较熟,用事件很容易解决这个问题,如果用消息机制,那就比较麻烦
 

和我的问题差不多,你可以参考http://www.delphibbs.com/delphibbs/dispq.asp?lid=883220
的讨论
问题最终解决了.经过一番大改动(重写了95%的代码),我的程序最终实现是这样:

屏弃所有Delphi自带或第三方的封装winsock的组件,直接使用Winsock API,数据库
查询采用ADO连接MS-SQL后台数据库,应用服务器启动后由主线程创建一个socket套
接字监听,同时根据用户设置创建指定大小的线程池,线程创建时完成ADO数据库
连接组件(TADOConnection和TADOStoredProc)的动态创建,并连接到后台SQL服务
器.这样就完成了Database Pooling和Obj pooling式的初始化动作,之后工作线程
以抢占方式接受客户端的连接和数据包接收(Server监听的Socket为全局的,每个线程
中去循环调用Accept取待连接客户端队列,使用临界区保护,数据包经过解析,分别执行不
同的SQL存储过程,然后将结果发给客户端,完成各自的任务.现在应用服务器可以开启500个
以上线程大小的线程池,接受和处理几千个并发请求了.如果硬件更好,还可以支持
和处理更多的请求. 服务器和客户端的通信协议采用自定义的数据包格式,客户端
无需用到任何数据库组件(这也是大部分网络游戏的共同点).现在服务器工作非常的
稳定,总算比较圆满的解决了这个问题.最近还研究了一下apache for win的工作原理
,发现两者的基本思路差不多.

总结一下心得: 对于这种对性能要求比较严格的场合,BDE是完全上不了台面的,假如我
用bde,那线程池的大小没办法超过64个(因为连接组件是在线程动态创建的,每个线程得
使用自己的连接组件,BDE有Session不能同时超过64个的限制),而用ADO,我可以创建几乎
无限的连接组件(取决于硬件和后台MS-SQL的设置).
 
开发服务器端的SOCK程序,你可以选择使用DXSOCK,虽然有BUG.但是还是比较好
 
后退
顶部