C#通用Windows StreamSocket客户端未连接到StreamSocketListener服务器

M35*_*579 2 c# sockets server uwp

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

但是,我尝试从Python REPL和C#客户端连接到此服务器,但两次连接都超时.我将我的代码与Github上的Microsoft的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(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

这是该服务器的子类:

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

    override protected void OnData(String data)
    {

    }

    override protected void OnEnd()
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

            Subclass manager = new Subclass();
            manager.Listen("8003");
        }
Run Code Online (Sandbox Code Playgroud)

最后,这是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();
            }
        }
Run Code Online (Sandbox Code Playgroud)

它打印"关于连接"和"制作SocketStream",但一段时间后会出现超时错误.

我究竟做错了什么?

小智 6

你从另一台机器连接?您无法从在同一台计算机上运行的其他应用程序或进程连接到StreamSocketListener,甚至不能使用环回免除.您需要在另一台计算机上运行客户端.

  • 您能否评论一下如果存在环回豁免,为什么我们无法连接到StreamSocketListener?那么,环回豁免有什么意义呢?还有其他方法可以解决UWP上的安全问题吗? (2认同)