请教一个高性能TCP连接服务器端的问题。

jun_01 2008-03-13 09:27:16
有这样一个需求,在服务器上监听着一个端口,大概有1000个以上的客户端会和服务器保持TCP长连接。

他们直接的通讯量不是很大,平时主要是心跳包比较多,但偶尔会出现需要同时给这1000个客户端发信息的情况。

现在客户端的数量不是很多,我目前的做法是,服务器端每监听到一个新连接,就开一个线程,负责和客户端通讯,同时这个线程不断的查询数据库,如果有需要发送的信息,就发下去。

如果将来客户端多了,请问这样的模式需要如何改进?另外对服务器硬件有没有什么特殊要求?

我担心的主要有:

1,一个程序中开上千甚至上万个线程,是否会有问题?
2,同时有上千个线程去查询数据库,似乎数据库支持不了这么多连接吧?(SQL Server 2000)
3,同时有上千甚至上万个客户端,服务器端的SOCKET要怎么写呢,是不是要用到完成端口之类的?网游的服务器一般能接受多少个连接呢?
4,如果用C#,能否完成上述工作?我目前用的就是C#。
...全文
1197 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
dbgchen 2011-07-01
  • 打赏
  • 举报
回复
mark
islife 2010-11-25
  • 打赏
  • 举报
回复
推荐ACE的哥们真是不怕累死楼主,ACE我研究了两个多月才用到了我的项目中,而且还要调试解决掉内存泄漏这个万恶的东西,要知道ACE的内存泄漏可不只在一个地方有啊。。。。费了偶好多细胞才解决问题。。

当然ACE是个好东西,但是得花时间和耐心。
zzuyongp 2008-11-24
  • 打赏
  • 举报
回复
.net2.0的异步貌似不是完成端口的、、、3.0据说就是了。。。还没研究。。。
目前我写的也是2.0 异步多线程。。。。
哥们,你是做远程数据抄收方面的吧? 呵呵
jun_01 2008-05-09
  • 打赏
  • 举报
回复

分不够了,所以后边的朋友没分了,抱歉。

另外不同意这个朋友的看法:
[Quote=引用 10 楼 star119119 的回复:]
2,同时有上千个线程去查询数据库,似乎数据库支持不了这么多连接吧?(SQL Server 2000)
===================================
可以,数据库绝对没问题,就怕你程序处理不过来. [/Quote]
我记得sql server里边的什么授权设置,最大只能设置到100吧(当然没用过正版的企业版,不是很肯定)。
而且一旦数据库连接达到几十个,而数据库中的数据量很大的时候,整个数据库就动不了了。
jun_01 2008-05-09
  • 打赏
  • 举报
回复
今天来结贴
这个帖子所问的问题,暂时还没得到验证,但是微软文档里说了,C#的异步Socket就是使用的完成端口。

所以暂时不考虑其它方法,程序我们已经写了个大概,先这样上,不行再说。

目前在做项目的web和中间层,月底之前能出来整个项目的雏形,要开始测试,估计到6月份去了。
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
不会,帮顶
sakurako 2008-04-10
  • 打赏
  • 举报
回复
完成端口也只是一些API,C#应该可以用。另外完成端口是线程池的一种实现方式,线程池刚好适用于连接数量巨大,线程存活时间短的情况中。
数据库方面不大懂。

wanglovec 2008-04-10
  • 打赏
  • 举报
回复
3,c#似乎没有办法用完成端口,网上有一些这方面的资料,看起来都是抄的同一份代码。但是c#可以用异步Socket,不知是否能满足要求呢?

>> 楼主 我也正在搞这部分,用异步是目前在C#上效率最高的。如果还不能满足你的要求,可以考虑换C++ 完成端口
僵哥 2008-04-09
  • 打赏
  • 举报
回复
C#使用完成端口,个人以为并不是什么不可行的事情,关键点在于两个,一个是内存不能托管,必须使用API来申请加入自建内存池进行管理,托管的内存,无法知晓系统对内存的使用状态,从而误判,导致内存访问冲突,另一个则是高性能列表的选择,而其中内存的管理会是导致“可行”或“不可行”的直接原因。
jun_01 2008-04-09
  • 打赏
  • 举报
回复
================
我是楼主,不好意思,好久没上来
================

最近找了一些资料,基本进展如下:
1,数据库基本没有问题,数据库本身是我负责,我可以用一个线程不断的查询数据库,得到数据后分发给各个客户端。
2,经楼上朋友指点,一个应用程序中能开的线程是有限的,那么必须减少线程。
3,c#似乎没有办法用完成端口,网上有一些这方面的资料,看起来都是抄的同一份代码。但是c#可以用异步Socket,不知是否能满足要求呢?
4,楼上有朋友说的采用类似http的方式,使用短连接,这是不行的,硬件已经没有办法改变了。
5,楼上有朋友说的换成c++,这个代价比较高,不到万不得已,不考虑。
僵哥 2008-03-21
  • 打赏
  • 举报
回复
4,如果用C#,能否完成上述工作?我目前用的就是C#。
》》 不能,或者说很困难, 我这一段也在搞这方面的东西, 但是找了很久 也没找到 C# 关于完成端口方面的资料,在 codeproject 上有个老外写的,但网友反应 BUG 很多,基本上没法用。 另 直接调用API 可能不行,由于指针之类的问题, 你授手看 具体原因我不是很清楚。
==================
示例示例,只是做一个引导性的作用。好的代码还要靠自身良好的经验积累。
wanglovec 2008-03-21
  • 打赏
  • 举报
回复
3,同时有上千甚至上万个客户端,服务器端的SOCKET要怎么写呢,是不是要用到完成端口之类的?网游的服务器一般能接受多少个连接呢?
》》完成端口 是最好的解决方案
4,如果用C#,能否完成上述工作?我目前用的就是C#。
》》 不能,或者说很困难, 我这一段也在搞这方面的东西, 但是找了很久 也没找到 C# 关于完成端口方面的资料,在 codeproject 上有个老外写的,但网友反应 BUG 很多,基本上没法用。 另 直接调用API 可能不行,由于指针之类的问题, 你授手看 具体原因我不是很清楚。
dxshenhua 2008-03-19
  • 打赏
  • 举报
回复
就这么千把个的连接量用WSAEVENT,或SELECT模型吧至少都比你现在一个连接看一个线程好。
僵哥 2008-03-19
  • 打赏
  • 举报
回复
当然前提是线程数量相当大,如果线程数量小,倒是可以为每个线程管理一个数据库连接。
僵哥 2008-03-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 marine8086 的回复:]
查询数据库可以在单个线程中,然后通知发送数据的线程。你用这么多线程是没必要的,线程间切换也很废资源,还是用完成端口好一些。

不知道数据库是不是由你来负责更新,不断查询数据库来判断是否需要发送数据,这样做也不太好,效率太低。
[/Quote]
没有规定说是查询数据库不可以使用多线程。对于这种应用最好的办法是对数据库采用连接池,而不是任何一个线程都拥有一个连接,个人经验八百多个每秒的数据库访问量,大概所需要的连接也只有四五十个。
scq2099yt 2008-03-16
  • 打赏
  • 举报
回复
ding
marine8086 2008-03-16
  • 打赏
  • 举报
回复
查询数据库可以在单个线程中,然后通知发送数据的线程。你用这么多线程是没必要的,线程间切换也很废资源,还是用完成端口好一些。

不知道数据库是不是由你来负责更新,不断查询数据库来判断是否需要发送数据,这样做也不太好,效率太低。
yebeans 2008-03-16
  • 打赏
  • 举报
回复
ACE是 C++库,C#能用么?人家用的是C#.
=========================================
连接多,通讯量不大正适合用完成端口(连接上万的话其他模型也很难胜任),学习和使用也不是很复杂(比起改成C++用ACE而言)。

数据库查询建立一个连接池,放N个数据库连接,需要查询的时候取一个出来,用完放回去就可以了,而且使用完成端口的话也不会有很多线程。



zyyoung 2008-03-16
  • 打赏
  • 举报
回复
ACE简介

(转载自中国互动出版网,http://www.china-pub.com/computers/emook/1111/info.htm)

文章摘要:

ADAPTIVE Communication Environment (ACE) 是一种免费开放原代码的面向对象框架结构,该结构实现了许多并行通信软件的核心设计模式. ACE提供丰富的C++ wrapper facades, 以及可跨平台执行通信软件的基本任务的框架对象。ACE提供的基本任务包括事件分离与事件处理的分发, 信号量处理,服务初始化 , 进程间通信, 共享内存管理, 消息路由, 分布式服务的动态配置, 并发执行与同步。

ADAPTIVE Communication Environment (ACE) 是一种免费开放原代码的面向对象框架结构,该结构实现了许多并行通信软件的核心设计模式. ACE提供丰富的C++ wrapper facades, 以及可跨平台执行通信软件的基本任务的框架对象。ACE提供的基本任务包括事件分离与事件处理的分发, 信号量处理,服务初始化 , 进程间通信, 共享内存管理, 消息路由, 分布式服务的动态配置, 并发执行与同步。
  ACE 的使用对象是面向开发高性能与实时通信服务应用的开发人员。它可以简化实现进程见通信,event demultiplexing , 直接动态链接explicit dynamic linking,以及并发处理功能的面向对象网络应用与服务的开发过程。 同时, ACE 通过在运行过程中动态将服务连接到应用中并在一个或多个进程或线程中执行这些服务这种方式实现了系统的自动配置与重新配置。
  ACE 仍在不断的发展,它的应用前景非常光明。ACE的商业用途的支持由 Riverace 公司使用公开原代码方式进行. 同时,许多ACE 开发小组的成员正在进行 ACE ORB (TAO)的开发工作。

1. 使用ACE的优点

  使用ACE的主要优点包括:
  高可移植性 - ACE部件使书写某一操作系统的并行网络应用和快速移植到许多其他操作系统平台变的非常容易。而且,因为ACE 是开发原代码、免费的软件,你不需担心在特定的操作系统或编译配置时被卡住。 
  增强的软件质量 - ACE部件是使用许多可增强通信软件关键的质量特性(如灵活性、可扩展性、可重用性与模块化等)的重要设计模式来设计的。
  高效率与可预见性predictability - ACE通过小心的设计来支持对于不同应用质量的服务(application quality of service,QoS)的需求,包括对于延迟敏感的应用使用较少的延迟,要求较强通信带宽的应用提供高性能的服务,以及对实时性应用的可预见性等服务。
  可容易的整合为高级的中间件 -- ACE 在TAO提供了可重用的部件与模式。而TAO是一个为高性能与实时系统应用优化过的,通过开放原代码实现了CORBA兼容标准。这样, ACE与TAO被设计用来协同工作来实现复杂的中间件解决方案。

2. ACE的结构与功能

  下图说明了ACE关键的部件以及他们之间的层次关系。

  
                        图表 1
  图中的结构与层次关系在下面描述。

3. ACE接口层(ACE Adapter Layer)

  该层在C编写的本地操作系统API之上。该接口层使在ACE中的其他层与部件与下面的平台相关的操作系统API隔离开来:
  并发与同步 - ACE接口层封装了操作系统的多线程、多进程与同步机制相关的API。
  进程间通信与共享内存-- ACE接口层封装了操作系统的本地与远程进程间通信,和共享内存管理的相关API。
事件分离机制 - ACE的接口层封装了操作系统中,有关同步和异步分离基于I/O、计时器、信号量、和同步事件的部分功能。
  显式动态链接-- ACE接口层封装了操作系统的显式动态链接相关的API,该功能允许应用服务不管在安装与运行时都可被配置。
  文件系统机制 -- ACE接口层封装了操作系统的文件系统API来操作文件与目录。
  ACE操作系统接口层的移植性使它可以在许多不同的操作系统平台上运行。 ACE已经在许多操作系统平台上被移植并被测试 包括Win32 (i.e., WinNT 3.5.x, 4.x, 2000, Win95/98, and WinCE using MSVC++, Borland C++ Builder, and IBM's Visual Age on Intel and Alpha platforms), 许多UNIX的版本 (e.g., Solaris 1.x and 2.x on SPARC and Intel, SGI IRIX 5.x and 6.x, DG/UX, HP-UX 9.x, 10.x, and 11.x, DEC/Compaq UNIX 3.x and 4.x, AIX 3.x and 4.x, DG/UX, UnixWare, SCO, and freely available UNIX implementations, such as Debian Linux 2.x, RedHat Linux 5.2 and 6.0, FreeBSD, and NetBSD), 实时操作系统(e.g., LynxOS, VxWorks, Chorus ClassiX 4.0, QnX Neutrino, and PSoS), MVS OpenEdition, and CRAY UNICOS. 单一的原代码树被用到所有操作系统平台上。
  ACE当前也有JAVA版本。
  因为有ACE操作系统接口平台的抽象,单一的原代码树被用到所有操作系统平台上,该设计简化了ACE的可移植性与可维护性。

4. 操作系统接口的C++包装接口(C++ Wrapper Facades for OS Interfaces)

  我们完全可以直接在ACE操作系统接口层之上开发高移植性的C++程序。但是,更多的开发者选择使用如图所示ACE的C++封装层。C++封装层通过提供封装并增强本地操作系统并发控制、通信、内存管理、事件分离、动态链接,与文件系统API,提供类型安全接口简化应用的开发。应用可通过有选择的继承、聚集或实例化下列对象来使用这些封装:
  并发与同步部件-ACE抽象了本地操作系统的多线程和多进程机制,如互斥,信号量来创建如活动对象(Active Objects)与多态未来(Polymorphic Futures)等高级面向对象并发抽象。
  进程间通信与文件部件 --ACE C++ 包装者封装了本地和远程的进程间通信机制如:接口(sockets), TLI, UNIX FIFOs与STREAM pipes, 以及Win32 的命名管道(Named Pipes). ACE C++ 包装者封装了操作系统当中文件系统的APIs。
  内存管理部件 - ACE的内存管理部件对于管理进程间共享内存和进程外栈内存的动态分配与回收,提供了灵活、可扩展的抽象机制。
  C++包装者提供了许多与操作系统接口层同样的特性。但是,这些特性不是使用单独的C函数构造的,他们是使用C++类与对象来构造的。这些面向对象的包可减少直接学习与使用ACE所花费的精力。
  比如,由于C++包装者是强类型的,所以,使用它可以增强应用的健壮性。因此,编译器可以在编译时间检测到系统类型不匹配而不是在运行时间。相反,对于C级别的操作系统的一些API如,接口、文件系统I/O等,在运行时间之前几乎不能检查到系统类型的不匹配 。
  ACE使用许多技术来减少或最小化执行成本。如ACE通过它的操作系统接口层和C++包装者提供的附加的类型安全性与不同的抽象级别,使用C++扩展的内联性(inlining)减少相关的方法调用的成本。同时,ACE注意避免在关键任务的包装者上使用需方法,如接口与文件I/O的send/recv方法。

5. 框架结构(Frameworks) 

  ACE同时包含了高级网络编程框架,该框架集成且增强了低一级的C++包装接口。该框架支持动态地将并发分布式服务配置成为应用。ACE的框架结构部分包含以下部件:
  事件分离器部件(Event demultiplexing components)--ACE的接收者(Reactor)与超动者(Proactor)是可扩展的、面向对象的事件分离器。这些分离器可以基于各种类型的I/O、计时器、信号量、与同步相关事件来分发各种应用相关的操作句柄。
  服务初始化部件(Service initialization components)--ACE 接收者(Acceptor)和连接者(Connector)部件是分别从特定应用任务中分离出来的,在服务初始化完成后,执行主动与被动初始化角色。
服务配置部件(Service configuration components )-- ACE服务配置管理者可以配置应用,使其可在安装或运行时组装服务。
  分层流部件(Hierarchically-layered stream components) -- ACE流部件简化了通信软件应用的开发过程,比如用户级的协议堆栈,它可由层次结构的服务构成。
  ORB接口部件(ORB adapter components) -- ACE可以通过其ORB接口部件,无缝地集成单线程和多线程的CORBA应用。
  使用ACE框架部件可促进通信软件的开发。使用它,通信软件可以在不用修改、重新编译、重新链接、或是经常重新启动应用程序的情况下,更新或扩展应用。该灵活性在ACE中是通过结合以下方面实现的:
  a) C++语言特性,如模板、继承、和动态帮定。
  b) 设计模式,如抽象类工厂、策略、以及服务配置器等。
  c) 操作系统机制,如显式的动态链接与多线程。

6. 分布式服务与部件(Distributed Services and Components)

  除了它的操作系统接口层,C++封装层和各种框架部件外,ACE同时提供一套分布式服务标准库,这些库被分成可自含的包。尽管这些服务部件不是严格的ACE框架库,但这些部件在ACE中有以下角色:
  给出可重用的应用代码片段-这些服务部件提供了如命名、事件路由、日志、时间同步与网络封锁等一般分布式应用任务的可重用实现。
  给出ACE部件的基本用例的示范--这些分布式服务同时证明了如何使用象 反应者(Reactors),服务配置( Service Configurators),接收者与连接者( Acceptors and Connectors),活动对象(Active Objects),以及进程间通信的封装(IPC wrappers) 等ACE部件,有效开发灵活、高效和可靠的通信软件。

7. 高级分布式计算中间件对象(Higher-level Distributed Computing Middleware Components)

 即使使用象ACE这样的通信框架,开发健壮的、可扩展并且高效的通信程序是非常有挑战性的工作。开发人员必须掌握大量的复杂操作系统与通信概念,比如:
网络寻址与服务识别
  描述转换, 如在异构系统间和不同处理器的字节循序间的加密、压缩与网络字节顺序转换。
  进程与线程的创建与同步。
  系统调用和对于本地与远程的进程间通信机制的类库常规接口。
  通过使用如CORBA,DCOM或JAVA RMI等高级的分布计算中间件,有可能减轻部分开发通信应用的复杂程度。高级分布计算中间件包含有服务器端与客户端两部分,并自动完成许多繁杂且易于出错的分布式应用开发工作,比如:
  验证,授权与数据安全。
  服务的查找与帮定。
  服务的注册与激活。
  对于事件的分离与发送。
  在面向字节流通信协议之上实现如TCP协议的消息框架。
  如网络字节码转换或参数排列等的描述转换问题处理。
  为了给通信软件开发者提供这些特性,在ACE中打包了下面的高级中间件应用:
  ACE ORB (TAO) - TAO是使用ACE中提供的框架结构对象与模式实现的针对高效与实时系统的CORBA应用。TAO中包含了网络接口,操作系统,通信协议以及CORBA中间件对象与相关特性。TAO基于标准的OMG的CORBA参考模型, 并且针对传统ORBS对于高效和实时应用系统的缺点,加入了相应的改善设计。TAO,与 ACE一样,都是免费的开放原代码的软件。
  JAWS -- JAWS TAO是使用ACE中提供的框架结构对象与模式实现的针对高效与实时系统的可适应性的WEB服务器。JAWS 被设计为框架的框架。JAWS的总体框架包含以下部件与框架: 一个事件调配者,并发策略 ,I/O 策略,协议管道 , 协议处理者,以及缓冲的虚拟文件系统。通过结合与扩展ACE中的部件,每种框架被设计为一套可协作的对象。JAW也是免费的开放原代码的软件。
zyyoung 2008-03-16
  • 打赏
  • 举报
回复
ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework),在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++ Wrapper Facade(包装外观)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。ACE的目标用户是高性能和实时通信服务和应用的开发者。它简化了使用进程间通信、事件多路分离、显式动态链接和并发的OO网络应用和服务的开发。此外,通过服务在运行时与应用的动态链接,ACE还使系统的配置和重配置得以自动化。

加载更多回复(14)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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