【问题标题】:.NET Network Library.NET 网络库
【发布时间】:2018-10-04 07:58:32
【问题描述】:

我一直在为 C# 寻找一个不错的网络库。 它将与 XNA 3.1 和 .NET Framework 3.5 一起使用。 多人游戏风格将是服务器和客户端。 目前我一直在研究Lidgren Library Network,但它似乎已经过时了。

任何人都对一个好的网络库提出了一些好的建议。它一次应该能够轻松处理 30 多个客户端连接。

【问题讨论】:

  • 如果库是用VB.NET编写的可以吗?
  • @John Saunders:如果库是编译的 .Net 程序集,它将使用 CIL,因此源语言是什么无关紧要。
  • @Callum:谢谢,我知道。我问马克,因为他要求“C# 网络库”。
  • 他要一个网络库FOR C#,而不是用C#写的。

标签: c# .net-3.5 networking xna


【解决方案1】:

虽然没有什么能阻止您自己编写所有低级网络代码,但使用库绝对是节省大量时间和压力的好方法,您可以更好地花时间改进自己的应用程序。

这里没有提到的库是networkComms.net。它具有大量复杂的功能(例如序列化、压缩和加密),但考虑到您特别提到的连接数,它能够处理 1000 多个连接,传输速率为 1Gbps+。 how to create a quick client server application 上有一篇简单的文章,但简而言之,您可以按如下方式发送和接收。

发送:

//This is the simplest way to send with more advanced options also available
//Parameters are message type, IP address, port and the object to send
NetworkComms.SendObject("Message", "127.0.0.1", 10000, "Networking in one line!")

接收:

//We need to define what happens when packets are received.
//To do this we add an incoming packet handler for 
//a 'Message' packet type. 
//
//This handler will automatically convert the incoming raw bytes into a string 
//(this is what the <string> bit does) and then write that string to the 
//local console window.
NetworkComms.AppendGlobalIncomingPacketHandler<string>("Message", (packetHeader, connection, incomingString) => { Console.WriteLine("\n  ... Incoming message from " + connection.ToString() + " saying '" + incomingString + "'."); });

//Start listening for incoming 'TCP' connections. The true 
//parameter means try to use the default port and if that 
//fails just choose a random port.
//See also UDPConnection.StartListening()
TCPConnection.StartListening(true);

免责声明:我是这个库的开发者之一。

【讨论】:

  • 您的几乎所有帖子都是明显是您的网站的广告,并且没有人透露这一事实。
  • @AndrewBarber - 作为记录,我是 networkComms.net 的开发人员之一。我从未试图隐藏这一点,我现在会修改我的个人资料以澄清这一点。
  • 请务必仔细阅读FAQ on Self-Promotion。具体来说,如果您的许多帖子都是促销性的,请查看它的部分,您可能是出于错误的原因来到这里。另请注意,每次链接到自己的网站/产品时,都要求发布免责声明。
  • @AndrewBarber - 明白了,我不知道免责声明的要求。
  • 为付费图书馆做广告,这隐藏了“下载”链接后面的付费图书馆这一事实,该链接会将您带到“请选择包!”列出价格的页面......如果它没有试图隐藏快速查看的事实,而是有一个“购买”链接,我会更喜欢。
【解决方案2】:

您的链接确实已过时;但如果您阅读该页面,它会将您引导至较新的版本:http://code.google.com/p/lidgren-network-gen3/

【讨论】:

【解决方案3】:

您似乎找错地方了。您似乎没有查看过 .NET Framework 本身。

使用 WCF 怎么样?用TcpListener怎么样?

你需要哪些这些没有提供?

【讨论】:

    【解决方案4】:

    WCF 是一种可能性,尽管对于这种情况它可能有点重量级。 .NET Sockets,OTOH,通常太低级了;它们不是一个容易插入的“组件”(在正确使用 Socket 类之前,必须很好地学习网络和多线程)。

    我编写了一个库 Nito.Async.Sockets,它是 Nito.Async 的一部分。它从套接字编程中消除了多线程考虑,还包括处理message framingkeepalives 的更高级别的抽象。

    【讨论】:

    • 在撰写本文时我不推荐 Nito.Async (v1)。来自 Nito.Async 网站的引述“当前的 Nito.Async.Sockets API 已被冻结。将开发一个新的 (v2) API,以更好地分离协议组件(例如,消息帧类型、keepalive 系统等),将都是正交的)。新的 API 可能基于 Rx 框架,但更有可能绑定到 .NET 4.0 任务并行库中。”
    • Nito.Async.Sockets 仍然可用; v2 API 已经计划多年,但我只是没有时间去做。
    【解决方案5】:

    lidgren 是如何过时的?它仍然是.NET space for gaming networking 中唯一的主要参与者。

    【讨论】:

      【解决方案6】:

      您是否尝试过 System.Net 中的内置 .Net 库?您根本不太可能需要使用外部库。 Here's 一个简单的线程 TCP 服务器示例,您可能还想查看 UDP。如果您只是谷歌一下,就会有很多教程。

      尝试查看System.Net.Sockets MSDN page 了解更多信息。

      【讨论】:

      • 虽然 vanilla socket 库对某些人来说已经足够了,但不喜欢有效管理资源的人应该寻找网络库或准备编写大量资源管理代码(缩放,最小化垃圾收集器,多线程、负载平衡、网络错误处理等)。
      【解决方案7】:

      此时我想将我的library 投入到这个线程中。 NuGet available as well.

      【讨论】:

        猜你喜欢
        • 2011-05-14
        • 1970-01-01
        • 2011-06-03
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        相关资源
        最近更新 更多