我正在尝试构建一个新的应用程序,以通过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会容易得多
hth

10-07 12:00