【问题标题】:C# Universal Windows StreamSocket clients not connecting to StreamSocketListener serverC# 通用 Windows StreamSocket 客户端未连接到 StreamSocketListener 服务器
【发布时间】:2016-02-10 21:23:12
【问题描述】:

我正在尝试使用 C# 和 UWP 编写一个简单的套接字服务器。到目前为止,我已经用 C# 编写了一个可以子类化的 SocketServer 类;我希望它像 Node.js 中的套接字服务器。

但是,我尝试从 Python REPL 和 C# 客户端连接到此服务器,但两次连接都超时。我将我的代码与 Microsoft 在 Github 上的 StreamSocket 示例进行了比较,但我无法弄清楚我做错了什么。我不知道是我的代码有问题还是我的计算机上的某些网络配置有问题。

这是我的服务器超类:

...    
    abstract class SocketServer
    {
        public SocketServer()
        {

        }

        public async void Listen(String port)
        {
            StreamSocketListener serverSocket = new StreamSocketListener();
            await serverSocket.BindServiceNameAsync("8003");

            serverSocket.ConnectionReceived += ClientConnectionReceived;

            Debug.WriteLine("Server started");
        }

        private void ClientConnectionReceived(
            StreamSocketListener sender,
            StreamSocketListenerConnectionReceivedEventArgs args)
        {
            Debug.WriteLine("Client connection received");

            OnConnection(args.Socket);

            DataReader reader = new DataReader(args.Socket.InputStream);

            try
            {
                // fill in later
            }
            catch
            {
                // fill in later
            }
        }

        abstract protected void OnConnection(StreamSocket socket);

        abstract protected void OnData(String data);

        abstract protected void OnEnd(); 
    }
}

这是该服务器的子类:

class Subclass: SocketServer
    {
    override protected void OnConnection(StreamSocket socket)
    {
        Debug.WriteLine("Got connection");
    }

    override protected void OnData(String data)
    {

    }

    override protected void OnEnd()
    {

    }
}

这是实例化服务器的代码(在 App.xaml.cs 中):

        public App()
        {
            ...
            Debug.WriteLine("==========================");

            Subclass manager = new Subclass();
            manager.Listen("8003");
        }

最后,这里是 C# 客户端代码(在 App.xaml.cs 中):

public App()
        {
            ...
            Debug.WriteLine("========================");

            StartClient();
        }

        async void StartClient()
        {
            try
            {
                Debug.WriteLine("About to connect");
                StreamSocket socket = new StreamSocket();
                Debug.WriteLine("Made StreamSocket");
                await socket.ConnectAsync(new HostName("localhost"), "8003");
                Debug.WriteLine("Connected");
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                Exit();
            }
        }

打印“About to connect”和“Made SocketStream”,但过了一会出现超时错误。

我做错了什么?

【问题讨论】:

  • 你不是在等待构造函数中的异步调用,你需要使用.Result。
  • 什么是.Result? StreamSocket 没有名为 Result 的属性。你说的是服务器还是客户端?
  • public async void Listen(String port) 应该是 public async Task 不是无效的。然后在App() 你可以打电话给manager.Listen("8003").Wait()(不是结果,我的错)。不要使用 async void,除非您将其用作事件处理程序,否则请始终使用 async Task。
  • 顺便说一句,你必须使用Wait调用,你不能将构造函数标记为async
  • 我做了那些事情,但仍然出现错误。消息是:Exception thrown: 'System.Runtime.InteropServices.COMException' in mscorlib.ni.dll WinRT information: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

标签: c# sockets server uwp


【解决方案1】:

您是从另一台机器连接吗?您无法从运行在同一台计算机上的另一个应用程序或进程连接到 StreamSocketListener,即使使用loopback exemption 也是如此。您需要在另一台机器上运行客户端。

【讨论】:

  • 如果有环回豁免,您能否评论一下为什么我们无法连接到 StreamSocketListener?那么,环回豁免的意义何在?是否有任何其他方法可以连接到 UWP 上的套接字来解决安全问题?
  • 我遇到了完全相同的问题 (stackoverflow.com/questions/56610586/…)。最后,我想在不同的 PC 上运行这两个应用程序,但对于测试,在一台 PC 上运行这两个应用程序会非常有帮助。有没有办法解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2013-12-26
  • 2011-11-05
  • 1970-01-01
  • 2023-04-09
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多