c++ - 关于server socket编程模型的问题

标签 c++ sockets

<分区>

在过去的几个月里,我一直致力于使用 C++ 和 Java 实现套接字服务器。我用 Java 编写了一个小型服务器,可以处理和处理来自托管在网站上的 Flash 应用程序的输入,并且我成功地编写了一个服务器来处理来自 C++ 中多个玩家的 2D 游戏客户端的输入。我在一个项目中使用 TCP,在另一个项目中使用 UDP。现在,我确实有一些在网上找不到的问题,我希望一些专家能帮助我。 :)

假设我想用 C++ 构建一个服务器来处理来自数千个独立和/或 Web 应用程序的输入,那么我应该如何设计我的服务器?到目前为止,我通常为每个连接的用户创建一个新的和唯一的线程,但我怀疑这是要走的路。

另外,如何确定通过网络发送的数据包的布局?数据通常是以二进制还是文本状态通过网络发送的?当您将数据发送到不同的媒体(例如 C++ 服务器到 Flash 应用程序)时,您如何处理序列化对象?

最后,除了 boost asio 之外,是否有任何易于使用的常用库支持可移植性(例如在 windows 机器上开发和在 linux 机器上部署)。

谢谢。

最佳答案

听起来您在这里有几个问题。我会尽我所能回答我能看到的。

<强>1。我应该如何处理网络服务器中的线程?

我会仔细查看您在服务器生成的工作线程上执行的工作类型。为每个请求生成一个新线程不是一个好主意……但如果并行请求的数量很少并且在每个线程上执行的任务运行速度很快,这可能不会造成任何伤害。

如果你真的想以正确的方式做事,你可以有一个可配置/动态的线程池,当工作线程空闲时,它会回收它们。这样你就可以设置最大线程池大小。然后,您的服务器将工作到池大小...然后发出进一步的请求,等待工作线程可用。

<强>2。如何格式化数据包中的数据?

除非您正在开发一个全新的协议(protocol)……这不是您真正需要担心的事情。除非您正在处理流媒体(或其他可以接受数据包丢失/损坏的应用程序),否则您可能不会为此应用程序使用 UDP。 TCP/IP 可能是您最好的选择……它将决定您的数据包设计。

<强>3。我使用哪种格式进行序列化?

通过网络序列化数据的方式取决于将使用您的服务的应用程序类型。二进制序列化通常更快,并且需要通过网络传输的数据量更小。使用二进制序列化的缺点是一种语言的二进制序列化可能不适用于另一种语言。因此,连接到您的服务器的客户端很可能必须使用您正在使用的相同语言编写。

XML 序列化是另一种选择。它将花费更长的时间并且有更大的数据量要通过网络传输。使用 XML 序列化之类的方法的好处是,您不会受限于可以连接到您的服务器并使用您的服务的客户端类型。

您必须选择最适合您的需求。

...试用不同的选项,找出最适合您的选项。希望您会找到比我在这里提到的任何东西都执行得更快、更可靠的东西。

关于c++ - 关于server socket编程模型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/880570/

相关文章:

python - 如何从 dlib 中的 5 个面部标志估计面部姿势?

c - 我需要遍历 getaddrinfo() 吗?

c - select 调用在 HPUX ia64 上超时

c++ - 我如何着手允许类类型的对象未初始化并在不使用指针的情况下识别这种情况?

c++ - () 运算符重载示例

c++ - 基于模板的条件类成员

c# - 我应该在关闭后手动处理套接字吗?

java - 服务器/客户端网络连接的当前方法是什么

delphi - Delphi 中的 SSL 套接字

c++ - 添加到多个 std 容器时 C++ 中的异常安全