如何使用c# NetworkStream ReadAsync()只抓取stx和etx之间的东西?
本文关键字:之间 etx stx 抓取 NetworkStream 何使用 ReadAsync | 更新日期: 2023-09-27 18:01:20
我正在尝试构建一个新的应用程序,通过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] 123456789 [ETX]
我想让我的代码,我只读取,直到我击中一个ETX字符。因此,我希望上面的例子是两个消息,但我不知道如何使用ReadAsync()。有人知道我该怎么做吗?
你基本上有两个选择。将整个流读入字符串,然后解析它,或者通过一个字节一个字节地读取来动态解析流,并在达到"神奇"的字节组合时停止。我个人认为,如果数据流不是很大,那么选项1将更容易实现hth