gpt4 book ai didi

C# 客户端无法背靠背触发服务器

转载 作者:太空宇宙 更新时间:2023-11-03 15:49:39 24 4
gpt4 key购买 nike

我有一个连接到 PC 的 Kinect 传感器,我的应用程序正在通过驻留在另一台 PC 上的 TCP 连接请求帧。我的问题是我无法触发两个请求并背靠背获取帧。

这是连接到传感器的服务器端的代码:

while(running)
{
if (networkStreamReceive.DataAvailable)
{
byte[] clientRequest = new byte[8];
networkStreamReceive.Read(clientRequest, 0, clientRequest.Length);
string clientData = System.Text.Encoding.ASCII.GetString(clientRequest);
clientData = clientData.Substring(0, clientData.IndexOf("$"));
if (clientData == "1")
{
// Process sensor data.
// Takes about 5-15 ms.
}
}
}

在客户端,它发出如下请求:

NetworkStream serverStreamSend = clientSocketSend.GetStream();    

//Send the request.
byte[] outStream = System.Text.Encoding.ASCII.GetBytes("1$");
serverStreamSend.Write(outStream, 0, outStream.Length);
Thread.Sleep(800); // Works for 1000ms and above.
serverStreamSend.Write(outStream, 0, outStream.Length);

receivedFrame = receiveFrame();
receivedFrame = receiveFrame();

receiveFrame 从流中读取数据。

这只有在我在客户端添加至少一秒的 sleep 时才有效。如果我删除 sleep ,我会看到客户端能够触发两个请求,但在读取第二个 receiveFrame 时卡住了。

在服务器端,我看到第一个触发器进入,但第二个触发器没有通过。当处理传感器数据的时间只有大约 10-15 毫秒时,我无法理解为什么会这样。

最佳答案

第二个确实通过了,但是您的代码没有注意到,因为您没有检查 Read() 方法的返回值以查看实际有多少数据可用。

当客户端发送请求的速度足够快时,它们会合并为一次传输,并且两个请求都可以在对 Read() 的一次调用中使用。但是您的代码将只检查该传输中的第一个请求,并丢弃第二个请求。

假设 $ 字符是您的协议(protocol)的分隔符,您应该更改服务器端,以便服务器继续从接收缓冲区一直读取数据直到结束,处理每个 $ - 分隔部分作为单个请求。

如果 $ 字符不是定界符,那么您将需要决定使用什么作为定界符并将其包含在您的协议(protocol)中。

关于C# 客户端无法背靠背触发服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26473449/

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