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

时间:2017-06-19 10:20:11

标签: c# sockets asynchronous tcp reactive-programming

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

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

好吧,我猜 SocketAsyncEventArgs 是我正在寻找的。为了处理请求响应,我应该创建事件处理程序并将其附加到Completed事件。所以我得到了一个异步和基于事件的代码,这对我来说很难。我搜索了可以帮助我解决这种情况的库,我找到了 Reactive Extensions(Rx)

  

Reactive Extensions(Rx)是一个用于组合异步的库   和使用可观察序列和LINQ风格的基于事件的程序   查询运算符。使用Rx,开发人员代表异步数据   使用Observables的流,使用LINQ查询异步数据流   运算符,并参数化异步数据中的并发性   使用调度程序的流。简单地说,Rx = Observables + LINQ +   调度器。

WebClient有一个Reactive Extensions的例子:

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实例并将其与Reactive Extensions一起使用?或者这是一个坏主意?

1 个答案:

答案 0 :(得分:0)

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