C# 事件驱动的TCP客户端

C# 事件驱动的TCP客户端,c#,events,tcp,client,C#,Events,Tcp,Client,我想要一个事件驱动的,windows,c,tcp客户端 当读取缓冲区中至少有35个字节时,我希望调用一个处理程序来读取这35个字节,从该数据包中获取一个长度值,然后对第二个长度的数据进行阻塞读取。要朝着正确的方向前进,请签出并重试 此外,还有一系列微软提供的关于如何使用上述功能的简便示例。这帮助我开始了这些 不幸的是,我看不到调用回调的选项,除非读取缓冲区中至少有35个字节;无论何时接收到任何内容,它都会被调用——即使是零字节。然而,交易对手很可能不会一个字节一个字节地向您发送消息。我认为BCL

我想要一个事件驱动的,windows,c,tcp客户端


当读取缓冲区中至少有35个字节时,我希望调用一个处理程序来读取这35个字节,从该数据包中获取一个长度值,然后对第二个长度的数据进行阻塞读取。

要朝着正确的方向前进,请签出并重试

此外,还有一系列微软提供的关于如何使用上述功能的简便示例。这帮助我开始了这些


不幸的是,我看不到调用回调的选项,除非读取缓冲区中至少有35个字节;无论何时接收到任何内容,它都会被调用——即使是零字节。然而,交易对手很可能不会一个字节一个字节地向您发送消息。

我认为BCL中没有任何基于事件的套接字类可用,但如果您只是在寻找比裸套接字更高级别的内容,也许您应该研究一下。它将为您处理底层流的缓冲,允许您通过StreamReader等进行访问:

TcpClient client;
// ... construct, connect, etc ...
new StreamReader(client.GetStream());

如果您使用的是基于线路的协议,您只需要使用,但也应该很容易满足您的目的。

有一个相对较新的项目基本上提供了以下功能:

从他们的页面:

基于IObservable实现一个非常易于使用的套接字API。它允许非常简单的协议实现,例如:


溪流就是溪流。任何大于一个字节的结构解释都在您的辖区内。您的代码需要组装消息头,解析它,积累剩余的消息数据,缓冲任何额外的字节以供以后解释。可悲的是,19世纪赢得了网络协议战争。哇。。。。克尼根和里奇没有提到要输掉礼宾战……谢谢你们,塞库奥和伊克。我会深入研究你的建议。事实上,现在是21世纪-
var client = new ReactiveClient("127.0.0.1", 1055);

// The parsing of messages is done in a simple Rx query over the receiver observable
// Note this protocol has a fixed header part containing the payload message length
// And the message payload itself. Bytes are consumed from the client.Receiver 
// automatically so its behavior is intuitive.
IObservable<string> messages = from header in client.Receiver.Buffer(4)
                               let length = BitConverter.ToInt32(header.ToArray(), 0)
                               let body = client.Receiver.Take(length)
                               select Encoding.UTF8.GetString(body.ToEnumerable().ToArray());

// Finally, we subscribe on a background thread to process messages when they are available
messages.SubscribeOn(TaskPoolScheduler.Default).Subscribe(message => Console.WriteLine(message));
client.ConnectAsync().Wait();