C# UWP无法在两个应用程序之间创建本地主机连接

C# UWP无法在两个应用程序之间创建本地主机连接,c#,tcp,uwp,C#,Tcp,Uwp,我正在尝试在两个UWP应用程序之间设置TCP连接。当服务器和客户端都在同一个应用程序中运行时,它可以正常工作。但是,当我将服务器部分移动到一个应用程序,将客户端部分移动到另一个应用程序时,ConnectAsync会抛出一个异常(服务器没有及时响应) 这两个应用都具有专用网络功能设置。我从MSDN页面了解到,只要我在调试器中运行应用程序,我就不必费心在CheckNetSolution中添加异常。(我选中了项目的debug属性页中的复选框,两者都启用了“允许本地网络环回” 防火墙也完全关闭了 我可以

我正在尝试在两个UWP应用程序之间设置TCP连接。当服务器和客户端都在同一个应用程序中运行时,它可以正常工作。但是,当我将服务器部分移动到一个应用程序,将客户端部分移动到另一个应用程序时,ConnectAsync会抛出一个异常(服务器没有及时响应)

这两个应用都具有专用网络功能设置。我从MSDN页面了解到,只要我在调试器中运行应用程序,我就不必费心在CheckNetSolution中添加异常。(我选中了项目的debug属性页中的复选框,两者都启用了“允许本地网络环回”

防火墙也完全关闭了

我可以在
netstat
中看到端口已打开且处于侦听状态:

 TCP    0.0.0.0:1337           PC-BAS:0               LISTENING
我使用的代码是从复制而来的,除了客户端和服务器托管在两个单独的应用程序中的部分之外,没有任何更改

客户:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        //this.StartServer();
        this.StartClient();
    }

    private async void StartClient()
    {
        try
        {
            // Create the StreamSocket and establish a connection to the echo server.
            using (var streamSocket = new Windows.Networking.Sockets.StreamSocket())
            {
                // The server hostname that we will be establishing a connection to. In this example, the server and client are in the same process.
                var hostName = new Windows.Networking.HostName("127.0.0.1");

                this.clientListBox.Items.Add("client is trying to connect...");

                await streamSocket.ConnectAsync(hostName, StreamSocketAndListenerPage.PortNumber);

                this.clientListBox.Items.Add("client connected");

                // Send a request to the echo server.
                string request = "Hello, World!";
                using (Stream outputStream = streamSocket.OutputStream.AsStreamForWrite())
                {
                    using (var streamWriter = new StreamWriter(outputStream))
                    {
                        await streamWriter.WriteLineAsync(request);
                        await streamWriter.FlushAsync();
                    }
                }

                this.clientListBox.Items.Add(string.Format("client sent the request: \"{0}\"", request));

                // Read data from the echo server.
                string response;
                using (Stream inputStream = streamSocket.InputStream.AsStreamForRead())
                {
                    using (StreamReader streamReader = new StreamReader(inputStream))
                    {
                        response = await streamReader.ReadLineAsync();
                    }
                }

                this.clientListBox.Items.Add(string.Format("client received the response: \"{0}\" ", response));
            }

            this.clientListBox.Items.Add("client closed its socket");
        }
        catch (Exception ex)
        {
            Windows.Networking.Sockets.SocketErrorStatus webErrorStatus = Windows.Networking.Sockets.SocketError.GetStatus(ex.GetBaseException().HResult);
            this.clientListBox.Items.Add(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
        }
    }
服务器:

    protected async override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        try
        {
            var streamSocketListener = new Windows.Networking.Sockets.StreamSocketListener();

            // The ConnectionReceived event is raised when connections are received.
            streamSocketListener.ConnectionReceived += this.StreamSocketListener_ConnectionReceived;

            // Start listening for incoming TCP connections on the specified port. You can specify any port that's not currently in use.
            await streamSocketListener.BindServiceNameAsync("1337");

        }
        catch (Exception ex)
        {
            Windows.Networking.Sockets.SocketErrorStatus webErrorStatus = Windows.Networking.Sockets.SocketError.GetStatus(ex.GetBaseException().HResult);
        }
    }

    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();
        }

        // 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();
            }
        }

        sender.Dispose();
    }
我做错了什么

更新 我试图用
checknetisolation
排除这两个应用程序:

C:\Users\baspr>checknetisolation环回豁免-s

列出环回豁免的AppContainers

----------------------------------------------------------------- 名称:bb9c7c66-7c8e-4736-b328-1b107e10a7a9_wkb2562a8jp2j SID:S-1-15-2-762432806-102046223-720402593-3591906639-2980959523-756744333-2219704472

[2]----------------------------------------------------------------- 名称:客户_wkb2562a8jp2j SID:S-1-15-2-2445159625-2135182799-200836335-1591194441-3000767028-3156876117-334533685

客户:

C:\Users\baspr>checknetisolation LoopbackExempt -a -n=client_wkb2562a8jp2j
OK.
服务器:

C:\Users\baspr>checknetisolation LoopbackExempt -a -n=bb9c7c66-7c8e-4736-b328-1b107e10a7a9_wkb2562a8jp2j
OK.
尽管我想知道这是否有必要,因为MSDN上已经说明了这一点:

环回和调试器

默认情况下,在Visual Studio调试器下运行会启用出站 仅针对该调试会话自动环回。您不应该 只要在中选中“环回”复选框,就必须执行任何操作 启动项目的调试器设置。如果要实现 套接字侦听器必须为入站启用本地主机环回 连接(见下文)

无论如何,它不会改变任何东西。我仍然无法连接到服务器。我尝试将我的本地IP地址作为环回地址(192.168.1.2和127.0.0.1)。它不起作用


希望任何人都能对此有所了解…

Ip地址127.0.0.1是环回地址,仅连接到同一台PC上的应用程序,不能用于连接两台不同的计算机。服务器应始终连接到IPAny,因此如果一台计算机有多个Ip地址,它将接受来自machi上任何以太网卡的连接ne.客户端应始终连接到远程IP地址或计算机名。最好使用计算机名,因为它从不更改。IP地址经常更改,尤其是在使用DHCP时,IP地址会定期更改。IP环回地址不能用于IPC“进程间通信”请参阅将对您有所帮助,因此您需要使用您的IP而不是本地主机。@muaz很抱歉回复太晚,但我认为您的回答不正确。在您提供的so链接中链接的MSDN页面中,明确说明了出于测试目的,环回是可能的。PS:在Visual Studio中使用IP地址iso环回会产生相同的结果好的应自动启用环境环回。但是,如果您仍在尝试:使用此命令删除所有豁免
loopbackemption–c
,并像您之前所做的那样重新生成豁免,一些人声称这对他们有效。