如何创建TCP客户端并管理许多TCP连接(可能使用SocketAsyncEventArgs和Reactive Exten



我正在开发一个WPF应用程序,该应用程序可以通过TCP协议重复连接到多个服务器,并有效地管理TCP连接(大约200个连接,也许更多)。应用程序中有一个IP地址列表,我应该连接到每个地址,发送命令字符串(json对象)并作为json对象获取响应。

我应该通过使用异步编程来避免性能瓶颈并增强应用程序的整体响应能力。有一个SocketAsyncEventArgs类,它提供了一种替代异步模式,可供专门的高性能套接字应用程序使用。此类专为需要高性能的网络服务器应用程序而设计。

好的,我想SocketAsyncEventArgs就是我正在寻找的。为了处理请求响应,我应该创建事件处理程序并附加到已完成事件。 所以我得到了一个异步和基于事件的代码,这对我来说是一个困难的话题。我已经搜索了可以帮助我解决这种情况的库,我发现了一个反应式扩展 (Rx)。

反应式扩展 (Rx) 是一个用于编写异步的库 以及使用可观察序列和 LINQ 样式的基于事件的程序 查询运算符。 使用 Rx,开发人员表示异步数据 具有可观察量的流,使用 LINQ 查询异步数据流 运算符,并参数化异步数据中的并发性 使用调度程序进行流传输。简单地说,Rx = 可观察量 + LINQ + 调度程序。

有一个 WebClient 反应式扩展的示例:

var client = new WebClient();
var downloadedStrings = Observable.FromEventPattern(client,
"DownloadStringCompleted");
downloadedStrings.Subscribe(
data =>
{
var eventArgs = (DownloadStringCompletedEventArgs)data.EventArgs;
if (eventArgs.Error != null)
Trace.WriteLine("OnNext: (Error) " + eventArgs.Error);
else
Trace.WriteLine("OnNext: " + eventArgs.Result);
},
ex => Trace.WriteLine("OnError: " + ex.ToString()),
() => Trace.WriteLine("OnCompleted"));
client.DownloadStringAsync(new Uri("http://invalid.example.com/"));

是否可以将 SocketAsyncEventArgs 实例放在这里并将其与反应式扩展一起使用?或者这是一个坏主意?

不能将SocketAsyncEventArgs与 WebClient 类一起使用。在.Net框架中有许多用于TCP通信的类。SocketAsyncEventArgs仅适用于 Socket 类。但是这个类很难使用,尝试更简单和用户友好的类,如TcpClient或WebClient。也许这些类的性能对于您的应用程序来说已经足够了。所有通信类都可以通过事件或异步方法与异步编程模型一起使用。

相关内容

最新更新