【问题标题】:TCP or UDP help with a server/client in c#?c# 中的服务器/客户端的 TCP 或 UDP 帮助?
【发布时间】:2010-11-08 02:35:25
【问题描述】:

谁能帮忙,我想弄清楚我需要做什么,我被赋予了用 TCP (UDP) 编写服务器和客户端的任务。基本上多个客户端将连接到服务器..服务器向客户端发送 MESSSAGES。

我在创建服务器和客户端时没有问题,但是使用 tcp 我不确定要走哪条路。 .net 3.5 是否支持一切,还是我需要继续寻找某些组件?

我正在寻找一些使用 c# 用于 TCP 或 UDP 的好例子。这是我不是100%确定的地方..据我所知有UDP和TCP ... 1已连接而1未连接..那么我该走哪条路,c#可以同时支持吗?优点/缺点?

如果服务器必须支持多个客户端,我只需要打开 1 个端口还是需要打开 2 个?

此外,如果客户端崩溃,我需要它不影响服务器,因此服务器可以忽略它并在连接打开或连接超时时关闭连接...如果实际上再次需要连接返回 tcp udp

我应该在哪里提出和选择我需要分配的协议和端口数量有什么想法吗?

谢谢

【问题讨论】:

    标签: c# .net tcp udp client-server


    【解决方案1】:

    UDP 缺点:

    • 数据包大小限制意味着您只能发送小消息(小于约 1.5k 字节)。
    • 缺少流使得 UDP 难以保护:难以制定适用于有损交换的身份验证方案,并且同样难以保护单个消息的完整性和机密性(没有可依赖的密钥状态)。
    • 没有传递保证意味着您的目标必须准备好处理消息丢失。现在很容易争辩说,如果目标可以处理完全丢失的消息(这可能的),那么为什么首先要费心发送它们呢?

    UDP 优点:

    • 无需在服务器上为每个客户端存储系统端点(即没有套接字)。这是连接到数十万客户端的 MMO 游戏使用 UDP 的主要原因之一。
    • 速度:每条消息都是单独路由的,这意味着您不能像 TCP 那样遇到流拥塞。
    • 广播:UDP 可以广播给一个网段上的所有监听器。

    如果你也在考虑 TCP,你甚至不应该考虑 UDP。如果您正在考虑 TCP,则意味着您正在考虑一个流(在消息顺序中恰好一次),并且使用 UDP 将在您的应用中承担碎片、重试和确认、重复检测和排序的负担.您很快就会在您的应用程序中重新发明 TCP,并且所有工程师都花了 20 年时间才使 正确(或至少与 IPv4 一样正确)。

    如果您不熟悉这些主题,我建议您顺其自然并使用 WCF,至少它为您提供了相对轻松地切换各种传输和协议的优势。如果您使用原始 .Net 套接字组件做出了错误的选择,那么将您的代码库从 TCP 更改为 UDP 将更加困难,反之亦然。

    【讨论】:

      【解决方案2】:

      在我看来,您并不清楚 TCP 和 UDP 之间的区别。

      TCP 是面向连接的。即 2 个对等点将有一个专用连接。数据包交付和订购得到保证。通常,服务器将提供一个端口,并且多个客户端可以连接到该端口(想想 HTTP 服务器和浏览器)。

      UDP 是无连接的。它不保证数据包交付,也不保证订购。您可以非常轻松地实现广播和多播机制。如果您需要某种可靠性,则必须在 UDP 之上实现它。有时您可能不在乎,只需发出请求并在没有响应时重试(SNMP 就是这样做的)。因为它是无连接的,所以您不必真正担心对等方的启动/关闭。如果需要,您只需重试即可。

      因此,您对协议的选择取决于上述内容。例如您的客户端是否需要与服务器的专用连接?您是否正在向多个客户端传输相同的数据?你能容忍丢包吗(例如实时价格更新等)。也许在您的应用程序中同时使用 TCP 和 UDP 来满足不同的需求是可行的(例如,用于注册订单的 TCP,用于传输价格更新/事件的 UDP?)

      我会考虑您的要求,并熟悉 TCP 和 UDP 的限制和功能。这应该会让事情变得更清楚一些。

      【讨论】:

        【解决方案3】:

        在这么低的级别上是否需要这样做?为什么不使用 WCF?它完全支持 TCP/IP 上的消息传递,使用二进制数据传输,但它的抽象级别比原始套接字高得多。

        【讨论】:

        • 是的!上帝你的权利!!!我一直在将 wcf 用于我的 Web 服务......虽然它允许服务器将信息推送到客户端但有一件事?基本上那个客户端需要接收消息但它应该需要轮询? ..如果是这样的话,我认为这解决了我的问题
        • @mark:我不知道纯推送场景,虽然我知道它支持双工通道,它提供从服务到客户端的回调。至于 NAT,请参阅 msdn.microsoft.com/en-us/azure/dd441706.aspx 并意识到他们只是通过使用您也可以使用的扩展点来完成所有这些工作,无论您是否使用他们的代码。
        • 谢谢!我已经接受了这个答案,因为 WCF 似乎适合我的需要!但是谢谢大家在 TCP 和 UDP 方面的 cmets
        • 我认为wcf回调通道实际上是两个独立的单向连接,所以nat和防火墙会是一个问题。在初始设置后,使用 tcp 套接字将为您提供真正的全双工消息传递。看看 System.Net.Socket 和 System.IO,你需要的都在那里。
        • .NET 服务总线的人对此深有体会。看看msdn.microsoft.com/en-us/azure/dd441706.aspx。他们可以做一些事情来通过 NAT,并于 2009 年 9 月在 PDC 上进行了演示。
        【解决方案4】:

        您需要的一切都在 .Net 3.5 中(可能在下面)。查看 MSDN 上的 UdpClient 类的文档和示例,以深入了解如何编写客户端/服务器。一个快速的谷歌在 C# 中的许多其他网络示例中找到了serverclient 的一些示例代码www.java2s.com。不要被域名吓到。

        【讨论】:

          猜你喜欢
          • 2012-12-18
          • 2012-01-04
          • 2016-05-31
          • 2012-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多