簡體   English   中英

你如何使用C#NetworkStream ReadAsync()來獲取stx和etx之間的東西?

[英]How do you use C# NetworkStream ReadAsync() to only grab stuff between stx and etx?

我正在嘗試構建一個新的應用程序,通過TCP / IP與另一個已完成的應用程序通信。 這兩個應用程序在彼此之間來回傳遞消息。 以下是我的新應用程序中的一些服務器代碼,它從已完成的應用程序中讀取內容:

public class AsyncService
{
    private IPAddress ipAddress;
    private int port;
    char[] STX = new char[] { '' };
    char[] ETX = new char[] { '' };
    NetworkStream networkStream;
    TcpClient tcpClient;
    private byte[] rawBuffer;

    private static readonly int RAWBUFFERSIZE = 2024;

    public AsyncService(int port)
    {
        this.port = port;
        string hostName = Dns.GetHostName();
        IPHostEntry ipHostInfo = Dns.GetHostEntry(hostName);
        rawBuffer = new byte[RAWBUFFERSIZE];
        this.ipAddress = IPAddress.Any;
        if (this.ipAddress == null)
        {
            throw new Exception("No IPv4 address for server");
        }
    }

    public async void Run()
    {
        TcpListener listener = new TcpListener(this.ipAddress, this.port);
        listener.Start();
        while (true)
        {
            try
            {
                tcpClient = await listener.AcceptTcpClientAsync();
                networkStream = tcpClient.GetStream();
                DoReadAsync(rawBuffer);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }
    }

    private void DoReadAsync(byte[] byteBuffer)
    {
        Task<int> t = networkStream.ReadAsync(byteBuffer, 0, byteBuffer.Length);
        t.ContinueWith((task, bytes) => OnReadCompleted((byte[])bytes, task.Result), byteBuffer, TaskContinuationOptions.OnlyOnRanToCompletion);
    }

    private void OnReadCompleted(byte[] byteBuffer, int length)
    {
        if (length == 0)
        {
            return;
        }

        string message = ASCIIEncoding.ASCII.GetString(byteBuffer);

        //...

        Array.Clear(byteBuffer, 0, byteBuffer.Length);
        DoReadAsync(byteBuffer);
    }

發送的每條消息前面都有一個STX字符,並以ETX字符結束。 問題是我的新應用程序有時會一次收到多條消息。 例如,我可能會收到這樣的消息:

[STX] 123456789 [ETX] [STX] 10111213141516171819 [ETX]

我想制作我的代碼,這樣我才會閱讀,直到我遇到一個ETX角色。 因此,我希望上面的示例是兩個消息,但我不知道如何使用ReadAsync()。 有誰知道我怎么做到這一點?

你基本上有2個選擇。 將整個流讀入一個字符串,然后解析它,或者通過逐字節讀取來解析流,並在達到“魔術”字節組合時停止。 就個人而言,如果數據流不是很大,那么選項1將更容易實現

暫無
暫無

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

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