C# 谁能解释一下这个服务器程序是如何关闭它的;每次连接后,都有一个插座吗?我怎样才能保持插座打开?
所以我想使用streamsockets在两个UWP应用程序之间建立TCP连接。我在微软的网页上找到了这个例子,它很有效。问题是,每次建立连接后,它都会关闭其套接字。我想了解它何时关闭(在代码中找不到它,这让我有点困惑),我还想知道如何保持服务器和客户端之间的连接打开,这样我就不必在每次发送内容时都重新连接 例如: 我查看了Windows上的StreamSocket文档,但找不到有关关闭套接字的内容 我假设它发生在这个方法的某个地方。它是在接收到连接时执行的程序的服务器端C# 谁能解释一下这个服务器程序是如何关闭它的;每次连接后,都有一个插座吗?我怎样才能保持插座打开?,c#,sockets,tcp,uwp,C#,Sockets,Tcp,Uwp,所以我想使用streamsockets在两个UWP应用程序之间建立TCP连接。我在微软的网页上找到了这个例子,它很有效。问题是,每次建立连接后,它都会关闭其套接字。我想了解它何时关闭(在代码中找不到它,这让我有点困惑),我还想知道如何保持服务器和客户端之间的连接打开,这样我就不必在每次发送内容时都重新连接 例如: 我查看了Windows上的StreamSocket文档,但找不到有关关闭套接字的内容 我假设它发生在这个方法的某个地方。它是在接收到连接时执行的程序的服务器端 private asyn
private async void StreamSocketListener_ConnectionReceived
(Windows.Networking.Sockets.StreamSocketListener sender,
Windows.Networking.Sockets.
StreamSocketListenerConnectionReceivedEventArgs args)
{
string request;
using (var streamReader = new
StreamReader(args.Socket.InputStream.AsStreamForRead()))
{
request = await streamReader.ReadLineAsync();
}
await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => this.serverListBox.Items.Add(string.Format("server received the request: \"{0}\"", request)));
// Echo the request back as the response.
using (Stream outputStream = args.Socket.OutputStream.AsStreamForWrite())
{
using (var streamWriter = new StreamWriter(outputStream))
{
await streamWriter.WriteLineAsync(request);
await streamWriter.FlushAsync();
}
}
string request;
using (var streamReader = new
StreamReader(args.Socket.InputStream.AsStreamForRead()))
{
request = await streamReader.ReadLineAsync();
}
await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
this.serverListBox.Items.Add(string.Format("server received the
request: \"{0}\"", request)));
// Echo the request back as the response.
using (Stream outputStream =
args.Socket.OutputStream.AsStreamForWrite())
{
using (var streamWriter = new StreamWriter(outputStream))
{
await streamWriter.WriteLineAsync(request);
await streamWriter.FlushAsync();
}
}
await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
this.serverListBox.Items.Add(string.Format("server sent back the
response: \"{0}\"", request)));
sender.Dispose();
await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
this.serverListBox.Items.Add("server closed its socket"));
}
任何帮助都将不胜感激
我在微软的网页上找到了这个例子,它很有效
不幸的是,所有Microsoft socket示例都不是编写socket应用程序的好示例。它们只是关于如何调用这些API的示例。构建一个具有生产质量的套接字应用程序并非易事,Microsoft套接字示例将误导您
例如,此套接字服务器:
- 使用
更新UI,而不是像Dispatcher
这样的现代解决方案IProgress
- 从其输入流读取,直到找到换行符。这是一个问题,因为:
- 请求到达时没有超时
- 输入缓冲区无限增长
- 无法处理半开放场景
对于套接字,实际上有两个流:输入流和输出流。当
sender.Dispose()时,两者都关闭代码>被调用。然而,当处置StreamReader
时,输入流也关闭,并且当处置StreamWriter
时,输出流也关闭。使用
块在其末尾执行这些操作。这就是为什么您在关闭StreamReader
后无法阅读第二条消息的原因,谢谢您的回复!我现在对代码的理解要好一点了。我将探索信号器,因为我非常喜欢学习套接字