- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建一个新应用程序,它通过 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/
我不确定我是否遗漏了什么或者 SslStream 中确实存在设计缺陷(可能还有其他可以包装内部流的流类)。 考虑这个伪代码: MyStream { Task ReadAsync() { ...
一段时间以来我一直在思考这个问题(并且知道这很愚蠢)。 我正在下载带有显示正常的 ProgressBar 的文件,但如何从 ReadAsync 流中获取数据进行保存? public static re
如果您不输入任何输入,为什么下面的代码永远不会完成,为什么即使在取消标记被取消后它仍然响应按下的键? // Set up a cancellation token var cancellationSo
我有以下代码(_ns 是一个 NetworkStream) await GetResponse(_ns); btnSend.Enabled = true; private async Task Get
我有一个 C# TcpClient 来异步读取数据。简化代码如下: public async Task StartReading(CancellationToken token) { // T
我以前使用过串行端口及其原始方法,如 BytesToRead、Read 和 Write。据说这些是不可靠的,我有很多忙等待我试图切换到它的异步方法。 我需要使用 2 个不同的超时时间从串口读取数据。第
我正在尝试使用 NetworkStream.ReadAsync() 来读取数据,但我找不到如何在调用后取消 ReadAsync()。对于背景,NetworkStream 由连接的 BluetoothC
当使用“SocketAsyncEventArgs”类和 ReadAsync 时,我应该将读取缓冲区放在哪里以及将发送缓冲区放在哪里?或者我只能一次阅读或发送而不是两者?我有点困惑。 最佳答案 我认为您
我正在尝试将下面的类转换为延迟返回文件。 public class ObservableFile2 : IObservable { private readonly IObservable s
试一试。使用单个按钮和按钮单击事件的以下代码设置新的 Windows 窗体应用程序: private async void button1_Click(object sender, EventArgs
当 NamedPipeServer 流从管道中读取任何数据时,它不会对 CancellationTokenSource.Cancel() 使用react 这是为什么? 如何限制我在服务器中等待来自客户
我正在使用 NetworkStream 和 TcpClient。 首先我设置我的 tcp 客户端: tcp = new TcpClient(AddressFamily.InterNetwork
NetworkStream.ReadAsync 什么时候任务完成?一旦接收到指定长度的数据? 如果是,它会返回 0 吗?然后 CancellationToken可以用作 ReadTimeout ,这是
在samples for the Cosmos DB SQL API , Database.ReadAsync() 有多种用途这似乎没有做任何有用的事情。该方法文档中的第二个注释并没有真正说明它可能用
在samples for the Cosmos DB SQL API , Database.ReadAsync() 有多种用途这似乎没有做任何有用的事情。该方法文档中的第二个注释并没有真正说明它可能用
我正在尝试在 .net 中使用 SerialPort 类。 我选择让我的服务保持异步,所以我在 SerialPort.BaseStream 上使用异步方法。 在我的异步方法中,我将一个 byte[]
鉴于以下情况: using System; using System.IO; using System.Threading; using System.Threading.Tasks; namespa
当调用 SQL Server 执行实际需要时间的操作时,SqlDataReader.ReadAsync() 会为我同步运行。有没有办法强制它异步运行,或者是我在 Task.Run() 中调用它的唯一选
我可以创建一个 MobileServiceClient 和 GetTable()至InsertAsync ,并查看如何将我的模型插入到 Azure 中的 Easy Table 表中。但是当我 Read
我正在尝试构建具有持久 TCP 连接的可扩展 服务器应用程序。我使用的序列化库是同步的,将其转换为APM会造成很大的开销(我已经测试过了)。 数据包的格式始终是数据包 ID 的一个字节,后跟几个 he
我是一名优秀的程序员,十分优秀!