在过去的几个月里,我一直在研究C++和Java中的套接字服务器的一些实现.我用Java编写了一个小型服务器来处理和处理来自网站上托管的Flash应用程序的输入,我成功地编写了一个服务器,用于处理来自具有C++多个播放器的2D游戏客户端的输入.我在一个项目中使用TCP,在另一个项目中使用UDP.现在,我确实有一些我在网上找不到的问题,我希望有些专家可以帮助我.:)
假设我想在C++中构建一个服务器来处理来自数千个独立和/或Web应用程序的输入,那么我应该如何设计我的服务器呢?到目前为止,我通常会为每个连接的用户创建一个新的唯一线程,但我怀疑这是要走的路.
另外,如何确定通过网络发送的数据包的布局; 数据通常是通过网络以二进制或文本状态发送的吗?当您将数据发送到不同的媒体(例如C++服务器到闪存应用程序)时,如何处理序列化对象?
最后,是否有任何易于使用的库,它通常用于支持可移植性(例如在Windows机器上开发和在Linux机器上部署)而不是boost asio.
谢谢.
听起来你在这里有几个问题.我会尽力回答我能看到的.
1.我应该如何处理网络服务器中的线程?
我会好好看看你在服务器生成的工作线程上做了什么样的工作.为每个请求生成一个新线程并不是一个好主意......但如果并行请求的数量很少并且在每个线程上执行的任务快速运行,它可能不会造成任何损害.
如果你真的想以正确的方式做事,你可以拥有一个可配置/动态的线程池,它可以在工作线程空闲时回收工作线程.这样您就可以设置最大线程池大小.然后,您的服务器将处理池大小...然后进一步请求等待工作线程可用.
2.如何格式化数据包中的数据?
除非你正在开发一个全新的协议......这不是你真正需要担心的事情.除非您正在处理流媒体(或其他可以接受数据包丢失/损坏的应用程序),否则您可能不会在此应用程序中使用UDP.TCP/IP可能是你最好的选择......这将决定你的数据包设计.
3.我使用哪种格式进行序列化?
通过网络序列化数据的方式取决于将使用哪种应用程序来使用您的服务.二进制序列化通常更快,并且导致需要通过网络传输的数据量更少.使用二进制序列化的缺点是一种语言的二进制序列化可能在另一种语言中不起作用.因此,连接到服务器的客户端很可能必须使用您使用的相同语言编写.
XML序列化是另一种选择.这将需要更长的时间,并且需要通过网络传输更多的数据.使用类似XML序列化的好处是,您不会局限于可以连接到您的服务器并使用您的服务的客户端类型.
您必须选择最适合您需求的产品.
...玩弄不同的选项,找出最适合你的方法.希望你能找到比我在这里提到的更快,更可靠的东西.
至于服务器设计问题,我会说你是对的:尽管ONE-THREAD-PER-SOCKET是一种简单易用的方法,但它不是一种可行的方式,因为它不会像其他服务器设计模式那样扩展.
我个人喜欢COMMUNICATION-THREADS/WORKER-THREADS方法,其中动态数量的工作线程池处理生产者线程生成的所有工作.
在此模型中,池中将有许多线程等待从另一组处理网络I/O的线程生成的任务.
我发现了Richard Stevens的UNIX网络编程以及这种网络编程方法的惊人来源.而且,尽管它的名字,它在Windows环境中也非常有用.
关于数据包的布局(你应该发布一个不同的问题,因为这是一个完全不同的问题,在我看来),在选择TEXT和BINARY方法时需要权衡.
TEXT(即XML)可能更容易解析和记录,并且通常更简单,而BINARY协议应该在处理速度和网络数据包大小方面提供更好的性能,但是您将不得不处理更复杂的问题比如ENDIANNES的单词和类似的东西.
希望能帮助到你.