C# 谁能解释一下这个服务器程序是如何关闭它的;每次连接后,都有一个插座吗?我怎样才能保持插座打开?

C# 谁能解释一下这个服务器程序是如何关闭它的;每次连接后,都有一个插座吗?我怎样才能保持插座打开?,c#,sockets,tcp,uwp,C#,Sockets,Tcp,Uwp,所以我想使用streamsockets在两个UWP应用程序之间建立TCP连接。我在微软的网页上找到了这个例子,它很有效。问题是,每次建立连接后,它都会关闭其套接字。我想了解它何时关闭(在代码中找不到它,这让我有点困惑),我还想知道如何保持服务器和客户端之间的连接打开,这样我就不必在每次发送内容时都重新连接 例如: 我查看了Windows上的StreamSocket文档,但找不到有关关闭套接字的内容 我假设它发生在这个方法的某个地方。它是在接收到连接时执行的程序的服务器端 private asyn

所以我想使用streamsockets在两个UWP应用程序之间建立TCP连接。我在微软的网页上找到了这个例子,它很有效。问题是,每次建立连接后,它都会关闭其套接字。我想了解它何时关闭(在代码中找不到它,这让我有点困惑),我还想知道如何保持服务器和客户端之间的连接打开,这样我就不必在每次发送内容时都重新连接

例如:

我查看了Windows上的StreamSocket文档,但找不到有关关闭套接字的内容

我假设它发生在这个方法的某个地方。它是在接收到连接时执行的程序的服务器端

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套接字示例将误导您

例如,此套接字服务器:

  • 使用
    Dispatcher
    更新UI,而不是像
    IProgress
    这样的现代解决方案
  • 从其输入流读取,直到找到换行符。这是一个问题,因为:
    • 请求到达时没有超时
    • 输入缓冲区无限增长
    • 无法处理半开放场景
Microsoft的大多数套接字示例都有相同的问题,在编写生产质量的套接字代码时必须解决所有这些问题。而且编写产品质量的套接字代码比最初看起来要困难得多

因此,如果可能,我始终建议使用替代技术(例如,自托管信号器)

但要回答你的实际问题:

我想知道它什么时候关闭


对于套接字,实际上有两个流:输入流和输出流。当
sender.Dispose()时,两者都关闭被调用。然而,当处置
StreamReader
时,输入流也关闭,并且当处置
StreamWriter
时,输出流也关闭。使用
块在其
末尾执行这些操作。这就是为什么您在关闭
StreamReader

后无法阅读第二条消息的原因,谢谢您的回复!我现在对代码的理解要好一点了。我将探索信号器,因为我非常喜欢学习套接字