簡體   English   中英

如何從 UWP 中的 StreamSocketListener 獲取數據?

[英]How can get Data from StreamSocketListener in UWP?

I'm setting up a StreamSocketListener in my UWP application to receive a request from a Windows Form client, Also, I want after the received special requested command (this command is String type) with TCP in my UWP application, It sending back some data在 Byte[] 或該客戶端請求它的字符串中。

我在 UWP 中的代碼:我像這樣初始化:

tcpListener = new StreamSocketListener();
tcpListener.Control.KeepAlive = false;
tcpListener.ConnectionReceived += TCPListener_ConnectionReceived;

並通過以下方式獲取數據:

private async void TCPListener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
        {
            try
            {
                string request;
                using StreamReader streamReader = new StreamReader(args.Socket.InputStream.AsStreamForRead());
                using StreamWriter streamWriter = new StreamWriter(args.Socket.OutputStream.AsStreamForWrite());

                while (true)
                {
                    request = await streamReader.ReadLineAsync();
                    if (!string.IsNullOrEmpty(request))
                    {
                        switch (request)
                        {
                            case "Command1":
                                //Do somthing i want
                                

                                            await streamWriter.WriteLineAsync("Done.");
                                            await streamWriter.FlushAsync();
                                            //When Job done I want send some data in string to Client
                                break;
                            case string stringRequest when stringRequest.StartsWith("Text"):
                                //Do somthing i want
                            

                                            await streamWriter.WriteLineAsync("Done.");
                                            await streamWriter.FlushAsync();
                                            //When Job done I want send some data in string to Client

                                break;
                            default:
                                break;
                        }
                    }
                }



            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

我想通過 TCPClient 在我的 WinForm 中發送的一些命令從 UWP 取回數據。 在我的 WinForm 應用程序中,我有:

using var tcpClient = new TcpClient ();
await tcpClient.ConnectAsync ("192.168.1.61", 1540);
using NetworkStream networkStream = tcpClient.GetStream ();

networkStream.ReadTimeout = 20000;

using StreamWriter streamWriter = new StreamWriter (networkStream);
using StreamReader streamReader = new StreamReader (networkStream, Encoding.UTF8);

streamWriter.AutoFlush = true;

await streamWriter.WriteLineAsync ("Command1");

byte[] bytes = new byte[tcpClient.SendBufferSize];

int recv = 0;
string received = string.Empty;
while (true) {
    received += streamReader.ReadLine ();
    if (received.EndsWith ("\n")) break;
}

Debug.WriteLine ($"Rec: {received}");

我可以正確連接並發送命令,但無法從服務器接收回數據我的 UWP 是 Kiosk 應用程序,我需要從中獲取一些數據

我認為這應該是工作:

首先在StreamSocketListener ConnectionReceived方法中執行以下操作:

private async void StreamSocketListener_ConnectionReceived (StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args) {

    try {

        string request;
        using StreamReader streamReader = new StreamReader (args.Socket.InputStream.AsStreamForRead ());

        while (true) {
            request = await streamReader.ReadLineAsync ();
            switch (request) {
                case "Command 1":
                    string screen = string.Empty;
                    try {
                        using DataWriter dataWriter = new DataWriter (args.Socket.OutputStream);

                        dataWriter.WriteString (scrennShotBase64); //or any you want like Byte
                        await dataWriter.StoreAsync ();
                        await dataWriter.FlushAsync ();
                        dataWriter.DetachStream ();
                    } catch (ArithmeticException ex) { Debug.WriteLine (ex); }
                    break;
                case "Command 2":
                    // do some...

                    break;
                default:
                    break;
            }
        }
    } catch (Exception ex) {
        Debug.WriteLine (ex.Message);
    }
}

在你的TCPClient中做這樣的事情:

try {
    using TcpClient tcpClient = new TcpClient ();
    tcpClient.ReceiveTimeout = 20000;
    tcpClient.NoDelay = true;
    tcpClient.ReceiveBufferSize = 20480000;
    await tcpClient.ConnectAsync ("192.168.1.1", 1338);
    using NetworkStream networkStream = tcpClient.GetStream ();
    networkStream.ReadTimeout = 20000;
    using StreamWriter streamWriter = new StreamWriter (networkStream);
    using StreamReader streamReader = new StreamReader (networkStream, Encoding.UTF8);
    streamWriter.AutoFlush = true;
    await streamWriter.WriteLineAsync ("Command 1");
    byte[] bytes = new byte[tcpClient.SendBufferSize];
    int recv = 0;
    string received = string.Empty;
    if (networkStream.CanRead) {
        StringBuilder CompleteMessage = new StringBuilder ();
        byte[] bytesR = new byte[102400];
        int numberOfBytesRead = 0;
        do {
            numberOfBytesRead = networkStream.Read (bytesR, 0, bytesR.Length);
            CompleteMessage.AppendFormat ("{0}", Encoding.ASCII.GetString (bytesR, 0, numberOfBytesRead));
        }
        while (networkStream.DataAvailable);
    } else {
        Debug.WriteLine ("You cannot read data from this stream.");
        tcpClient.Close ();
        networkStream.Close ();
        return;
    }
    networkStream.Close ();
} catch (Exception ex) {
    Debug.WriteLine (ex);
}

有關詳細信息,您可以在Microsoft上查看此頁面!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM