c# – 单个连接后,Observable TcpListener终止
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 单个连接后,Observable TcpListener终止,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2186字,纯文字阅读大概需要4分钟。
内容图文
我是Rx的新手,所以我可能在这里犯了一些重大错误.
我想创建一个非常简单的套接字服务器,它可以使用Observables接收来自客户端的消息.为此,我使用Rxx,它在System.Net.Sockets命名空间中提供扩展方法,并且还提供ObserableTcpListener静态工厂类.
这是我到目前为止所做的,几乎从各种来源偷走了它:
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9001);
TcpListener listener = new TcpListener(endpoint);
IObservable<TcpClient> clients = listener
.StartSocketObservable(1)
.SelectMany<Socket, TcpClient>(socket => SocketToTcpClient(socket));
.Finally(listener.Stop)
clients.Subscribe(client =>
{
OnConnect(client).Subscribe(
message => OnMessage(client, message),
ex => OnException(client, ex),
() => OnCompleted(client));
});
private static IObservable<TcpClient> SocketToTcpClient(Socket socket)
{
TcpClient client = new TcpClient();
client.Client = socket;
return Observable.Return<TcpClient>(client);
}
private static IObservable<byte[]> OnConnect(TcpClient client)
{
return client.Client.ReceiveUntilCompleted(SocketFlags.None);
}
private static void OnMessage(TcpClient client, byte[] message)
{
Console.WriteLine("Mesage Received! - {0}", Encoding.UTF8.GetString(message));
}
private static void OnCompleted(TcpClient client)
{
Console.WriteLine("Completed.");
}
private static void OnException(TcpClient client, Exception ex)
{
Console.WriteLine("Exception: {0}", ex.ToString());
}
这有效……直到某一点.我可以建立单个客户端连接.一旦该连接终止,似乎Observable序列终止并且.Foneally(listener.Stop)被调用.显然,这不是我想要的.
我尝试使用ObserableTcpListener.Start()工厂类,但这给我带来了完全相同的结果.
IObservable<TcpClient> sockets = ObservableTcpListener.Start(endpoint);
sockets.Subscribe(client =>
{
OnConnect(client).Subscribe(
message => OnMessage(client, message),
ex => OnException(client, ex),
() => OnCompleted(client));
});
我想我确实理解了这里的问题:在第一个客户端终止后,客户端可观察序列只是空的,因此调用.Final(listener.Stop).
我需要做些什么来规避这个?如何继续侦听传入连接?
解决方法:
在订阅时,让您的Observable变得热门并坚持下去.
IObservable<TcpClient> clients = listener
.StartSocketObservable(1)
.SelectMany<Socket, TcpClient>(socket => SocketToTcpClient(socket))
.Finally(listener.Stop)
.Publish().RefCount();
内容总结
以上是互联网集市为您收集整理的c# – 单个连接后,Observable TcpListener终止全部内容,希望文章能够帮你解决c# – 单个连接后,Observable TcpListener终止所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。