繁体   English   中英

.NET中是否有基于消息的TCP套接字库?

Is there any message-based TCP socket library in .NET?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

虽然我是套接字编程的新手,但是当我编写一个简单的tcp服务器 - 客户端程序时,我发现基于流的api并不方便使用。

我的程序很简单:

  1. 客户端连接到服务器
  2. 服务器在不可预见的时间间隔内不断向客户端发送消息
  3. 客户端接收消息并根据消息中包含的数据进行工作

但是,使用基于流的api,我必须:

  • 定义消息分隔符/分隔符
  • 使用while循环从流中读取数据
  • Concat所有字节,尝试查找分隔符
  • 如果存在分隔符 ,则拆分数据,提取消息

这是很多工作,甚至超过了我的程序的整个逻辑,所以我想知道是否有一个库可以为我做上面的东西,有这样的库我可以这样编程:

// Server
TcpListenerEx server = new TcpListenerEx();
TcpClientEx client = server.Accept();
client.SendMessage(new StringMessage("hello world"));

// Client
TcpClientEx client = new TcpClientEx();
client.Connect("localhost", 8989);
while (true) {
    IMessage message = client.ReadMesage();
    // Do work acording to message
}

任何建议都会受到欢迎,谢谢。

5 个回复

另一种选择可能是MSMQ,它是一个消息队列(而不是TCP / IP流),并处理消息而不是字节流。 MSMQ本身可以使用各种传输,包括TCP / IP或WCF等。

如果您只处理Windows(并且因为您提到.NET,这不是一个不合理的限制),它可以在Windows 2000的所有版本上使用。

这里有一些很好的示例代码,向您展示了使用它的基本方法,以及一些更高级的东西。 发送者基本上构建了一条消息并对其进行排队,这很简单。 听众收到完整的消息。

它可以简单得多,如果你想在Windows上发送消息,这是让它快速进行的最简单的方法之一。

在字节流中嵌入分隔符并不像它看起来那么容易。 您必须处理意外包含分隔符的消息。 这会导致许多令人讨厌的检测和转义代码。

构建消息的一种非常简单的方法是预先设置长度前缀。 在发送方上,您将消息序列化为缓冲区,然后写入长度,然后写入缓冲区。 接收器首先读取4个字节以获得长度。 然后它读取身体。

这不是内置于.NET中,可能是因为每个二进制协议都略有不同。

所有这一切都很简单,你不太可能找到一个图书馆。 这样的协议可以写成几十行。 我的建议就是亲自去做。

但是,如果你想构建你的消息,那么一个很棒的库: protobuf-net (用于.NET的Google协议缓冲区)。 它为您提供消息框架,并以非常理智的方式进行序列化。 它很好地支持协议版本控制。

Apache Thrift是另一种选择,类似于WCF,但更简单并且不绑定到某个.NET Framework。

http://thrift.apache.org/

它适用于.NET 2,甚至对于Mono,

http://thrift.apache.org/docs/install/

我认为SignalR开源框架应该有所帮助。

查看快速入门样品 ,看它是否符合您的要求。

现在您可能想要考虑使用WebSockets。

尽管名称它实际上是一个更通用的协议。 它本质上是面向消息的。 虽然消息可能被分成帧,但是有很多库会重新组合这些帧,这样您就可以收到完整的消息。

由于这些库,您可以使用WebSockets而非平台独立。 Node,.Net,纯浏览器javascript - 没问题。

1 基于消息的发布/订阅故障转移

我正在为游戏系统创建基础架构。 我需要它成为扩展和故障转移的消息基础。 它还将套接字用于消息的发布者/订阅者通知。 我面临的挑战是:我应该继续使用已有的ESB还是使用成熟的ESB(如nServiceBus或MassTransit)? 这是我到目前为止的内容,有点复杂。 首先,这是一 ...

2 基于消息的体系结构中的通用消息

我正在Swift中尝试基于消息的架构。 我正在尝试做类似于Elm Architecture的事情。 这是我的代码的样子: 因此状态由State建模,您可以通过发送Message来更改它。 如果要计算任何副作用,它们将作为SideEffect消息返回,并由其他人处理。 每个Side ...

3 使用信号量进行基于消息的通信同步

我正在处理旧版应用程序。 应用程序使用基于异步消息的协议与其他服务进行通信(使用Rabbitmq),我想为某些客户端开发同步Rest API。我想为此开发包装器或适配器,但不能更改旧版应用程序。 由于消息具有唯一的密钥,使用诸如密钥字典和信号量(或诸如SemaphoreSlim之类的其他东西)之类 ...

5 基于消息的多线程或线程池是一种短暂而罕见的操作?

我目前正在使用Retlang在.NET中基于消息的多线程,这是一个很棒的库。 我再也没有显式的锁了,每个线程都在做自己的事,管理应用程序的一部分,并通过消息与其他线程通信。 现在,我必须实现我的应用程序的功能,该功能也可以具有自己的发布者/订阅者线程。 唯一的问题是,该线程实际上将完成 ...

6 如何使用kubernetes复制控制器复制基于消息的服务

我们通常使用消息传递将消息发送到解耦的服务。 这使服务发现成为非问题,因为(例如,在RabbitMQ中使用AMQP)您可以使用代理的路由功能将消息分派到提供正确服务的正确队列。 负载平衡也由消息代理处理。 输入kubernetes。 在谈论服务复制和重新生成失败的服务时,通常会列 ...

7 基于客户端/服务器消息的互联网架构

问题 一段时间以来,我一直在思考基于消息的架构的复杂性,当消息传递的一个渠道包括互联网时。 我很满意在客户端排队消息的概念,在处理时,会导致通过互联网进行的Web服务调用,然后在服务器上对这些相同的消息进行排队,以便根据业务规则进行处理。 我目前不知道的是一种将消息发送回客户端以告 ...

9 类似于ROS的基于消息的机器控制模式

如果我有一个应用程序在一台计算机上运行,​​但希望有多个异步线程运行并相互通信以控制机械或机器人的复杂行为,那会是什么软件设计模式? 我特别在寻找类似于机器人操作系统 (ROS) 的东西,但更多的是在 c# 的单个库的上下文中,它处理消息或“消息总线”。 这些东西似乎有很多重叠的术语。 我本质上 ...

10 NET中基于TCP套接字的可扩展体系结构

场景:n个车辆与tcp服务器建立tcp套接字连接。 然后,服务器将传入的消息转储到数据库。 管理员也可以通过套接字向车辆发送命令,因此套接字必须是持久的。 问题:当前,只有一个tcp服务器和DB服务器。 问题:如何在.NET中使此体系结构可伸缩。 我们希望有更多的tcp服务器和 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM