gpt4 book ai didi

c# - 你如何使用 C# NetworkStream ReadAsync() 只抓取 stx 和 etx 之间的东西?

转载 作者:行者123 更新时间:2023-11-30 14:52:42 25 4
gpt4 key购买 nike

我正在尝试构建一个新应用程序,它通过 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 将更容易实现

关于c# - 你如何使用 C# NetworkStream ReadAsync() 只抓取 stx 和 etx 之间的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31272378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com