C# 如何通过streamsocket从服务器连续接收数据?

C# 如何通过streamsocket从服务器连续接收数据?,c#,uwp,stream-socket-client,C#,Uwp,Stream Socket Client,我是一名WPF程序员,现在是UWP的初学者。 我现在需要编写一个新程序来连接远程机器。机器会不时向客户端发送数据。 我希望每当机器发送数据时,客户端都能立即获取数据。 在WPF中,我可以使用异步客户端套接字,每当客户端有数据时,ReceiveCallback就会调用。 然而,在UWP中似乎没有异步客户端套接字。我使用SteamSocket成功连接远程机器,如下所示: Task.Run(async()=>{ try {

我是一名WPF程序员,现在是UWP的初学者。

我现在需要编写一个新程序来连接远程机器。机器会不时向客户端发送数据。

我希望每当机器发送数据时,客户端都能立即获取数据。

在WPF中,我可以使用
异步客户端套接字
,每当客户端有数据时,
ReceiveCallback
就会调用。

然而,在UWP中似乎没有异步客户端套接字。我使用
SteamSocket
成功连接远程机器,如下所示:

 Task.Run(async()=>{
                try
                {
                    StreamSocket SS = new StreamSocket();
                    await SS.ConnectAsync(new Windows.Networking.HostName("192.168.200.111"), "23");

                    DataWriter writer = new DataWriter(SS.OutputStream);
                    string content = "ST";
                    byte[] data = Encoding.UTF8.GetBytes(content);
                    writer.WriteBytes(data); 
                    await writer.StoreAsync();
                    writer.DetachStream();
                    writer.Dispose();

                    DataReader reader = new DataReader(SS.InputStream);
                    reader.InputStreamOptions = InputStreamOptions.Partial;
                    await reader.LoadAsync(1024);
                    string response = reader.ReadString(reader.UnconsumedBufferLength);
                    Debug.WriteLine(response);                       
                }
                catch(Exception ex)
                {
                    throw ex;
                }
            });
然而,这些代码只能在您使用
数据读取器时读取数据,而不能在一次收到数据时显示事件。

通过使用环回可以解决这个问题,我不希望代码因为环回而变得如此丑陋。

我在谷歌上搜索了一下,但没有发现任何有用的东西

我向微软工程师询问了这一点,他告诉我使用
SocketActivityTrigger
,我不想使用它,因为它不仅难以使用,而且还是一个后台工作人员。即使我退出UWP程序,它仍将连接到远程机器并持续接收数据。

您能告诉我如何解决吗


致@Nico Zhu:

 private void Button_Click(object sender, RoutedEventArgs e)
        {
            Task.Run(async()=>{
                try
                {                    
                    StreamSocketListener SSL = new StreamSocketListener();
                    SSL.ConnectionReceived += SSL_ConnectionReceived;
                    await SSL.BindEndpointAsync(new Windows.Networking.HostName("192.168.200.111"), "23");

                }
                catch(Exception ex)
                {
                    throw ex;
                }
            });
        }

        private void SSL_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
        {
            Debug.WriteLine("123");
        }
我使用了
StreamSocketListener
,但在我运行程序后,它会报告 "

{System.Runtime.InteropServices.COMException(0x80072741):请求的地址在其上下文中无效
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在App2.MainPage.d.MoveNext()}
"
这有什么问题吗?

谢谢@Nico Zhu对我的帮助。最后,我发现了一种奇怪的方法:在UWP中使用WPF的套接字

但奇怪的是,WPF的套接字在UWP中没有异步客户端套接字,所以我只能这样做:

 await Task.Factory.StartNew(async () =>
            {
                IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.200.111"), 23);
                Socket S = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                S.Connect(ip);
                S.Send(Encoding.UTF8.GetBytes("SS" + Environment.NewLine));
                while (true)
                {
                    byte[] buffer = new byte[1024];
                    if (S.Available != 0)
                    {
                        S.Receive(buffer);
                        Debug.WriteLine(Encoding.UTF8.GetString(buffer));
                        Debug.WriteLine("");
                        await Task.Delay(100);
                    }
                }
            });

@NicoZhu MSFT我刚刚使用您所说的StreamSocketListener更新了这个问题,但它报告了一个错误,{System.Runtime.InteropServices.COMException(0x80072741):请求的地址在其上下文中无效。这有什么问题?谢谢。是否添加了
privateNetworkClientServer
功能?@NicoZhu MSFT我已检查是否添加了privateNetworkClientServer/Internet(客户端和服务器)/Internet(客户端)能力。@NicoZhu MSFT对此我很抱歉,因为它是工厂中的一台机器,而不是远程服务器。我尝试使用StreamSocket,但奇怪的是StreamSocketListener不起作用。@NicoZhu MSFT我找到了一种奇怪的方法来解决它。虽然它不是那么完美,但请查看下面的答案。感谢您对我的帮助。
 await Task.Factory.StartNew(async () =>
            {
                IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.200.111"), 23);
                Socket S = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                S.Connect(ip);
                S.Send(Encoding.UTF8.GetBytes("SS" + Environment.NewLine));
                while (true)
                {
                    byte[] buffer = new byte[1024];
                    if (S.Available != 0)
                    {
                        S.Receive(buffer);
                        Debug.WriteLine(Encoding.UTF8.GetString(buffer));
                        Debug.WriteLine("");
                        await Task.Delay(100);
                    }
                }
            });