开源的C#套接字(TCP + UDP)库

4

我对.NET框架的标准socket类感到头疼。

有没有人能推荐一款高效的开源C# sockets(TCP+UDP)库来处理socket消息?


1
你是在寻找一些CLR套接字无法提供的特定功能吗?还是你只是想要源代码呢? - Brook
我也想要源代码。用于处理基于线程的TCP或UDP消息并进行回复。谢谢! - olidev
1
你的困扰是什么?你在尝试做什么?通常情况下,你会打开一个套接字,然后负责发送你想要的任何消息。 - TedTrippin
嗨,这是相当多的事情。但是你知道我提到的任何库吗?先谢谢了! - olidev
我在这里问了同样的问题:http://stackoverflow.com/questions/5785741/open-source-application-protocol-for-internet-applications,但你可以看到,除了“自己动手做”之外没有任何答案。我仍在寻找稳定易用的解决方案。 - Eugen
我相信一些好的教程会有很大帮助。到目前为止,我找到了一些2001年和2003年的教程,它们没有使用现代的类/方法。我理解你所说的头痛! - YetAnotherRandomUser
5个回答

6
使用 Kerry Jiang 的 SuperSocket 库或 Akka.NET
  1. SuperSocket nuget包已经超过了100k的下载量;需要注意的是2.0+版本适用于.NET Core,而1.6版本适用于.NET Framework 4.8及以下版本。
  2. SuperSocket.ClientEngine.Core 已经超过了700k的下载量。
  3. Akka (.NET版) 已经有超过1.2M的下载量,并且有一个特殊的Akka.NET.Test。
    • 从某种意义上说,这是一种欺骗,因为它将使用套接字的决定推迟到最后一刻。
    • "Akka"最初是一个Java/Scala项目,后来才转向.NET。
    • 因此,您应该搜索“Akka.NET”而不仅仅是“Akka”。
    • 通常情况下,您可能希望使用一些解决反压问题的网络IO方案,您可以使用C# 8中的Akka Async Streams来实现。
  4. RSocket是由前Netflix工程师Robert Roeser开发的新库。
    • 与Akka Streams类似,它提供了一种处理反压的方法。

另外,在使用消息队列库而非套接字库方面:

  1. EasyNetQ NuGet包已经有超过4M的下载量
  2. NetMQ NuGet包已经有超过600k的下载量
  3. ZeroMQ NuGet包已经有超过80k的下载量
    • 我在一个真实项目中使用过它,它运行良好,但它是一个C dll的绑定包装器

3

NetMQ 在简单套接字通信方面非常优秀。它处理消息的重构和许多繁琐细节。它适用于消息通信,但对于简单套接字也非常出色。请查看请求-响应。在套接字方面,您通常会遇到一个框架叠加在另一个框架上的情况,但是让 NetMQ 处理这些繁琐细节。


0

看一下包含在.NET中的WCF。


0

-1

.NET框架已经是处理TCP和UDP的库。相比于基本的Winsock API,它大大简化了这个过程。所以你想要一个在这个库之上的库吗?也许你会想要另一个在那个库之上的库?再加上一个?

我的观点是,你很可能找不到比.NET框架提供的更简单的东西。套接字是一个复杂的主题,需要你自己提供大量的实现。

一个库通常有用的地方是实现一些已经建立的协议(如SMTP或FTP),或者甚至为你创建自己的协议提供更多的工具。


1
@Mystere Man 绝对正确。将.Net套接字与您典型的WINSOCK程序进行比较,甚至将其与低级OSI代码进行比较,我认为您可以看到.Net几乎使套接字开发变得容易。@JoesyXHN 套接字编程是一个非常复杂的主题,不适合心脏薄弱者,没有什么捷径可以让它变得更容易。 - SRM
谢谢。您能否向我推荐一个TCP服务器实现的示例?你觉得这个怎么样?http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server 谢谢! - olidev
@JoesyXHN 那是一个好的开始(你提供的链接)。一旦你理解了基础知识,我建议你再去看一下异步方法。它们是创建可扩展解决方案的关键(虽然你仍然可以通过轮询获得可扩展性,但这要困难得多)。 - SRM
任何阻塞调用通常都有一个对应的BeginXXX和EndXXX。所以,在服务器示例中,您可以使用BeginListen和EndListen。对于读取,您可以执行BeginRead/EndRead,对于发送,您可以执行BeginSend/EndSend。在内部,它会启动一个线程并使用IO完成端口(在基于NT的系统上-所有当前的Windows服务器都是基于NT的)来确定操作何时完成。然后它调用您的异步处理程序。 - SRM
我不同意。例如,检查Java和Python的所有NIO库。Twisted框架就是一个例子。我希望在.NET上有一个类似的框架。 - jgauffin
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接