- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个连接到 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/
(背景:Why should I use int instead of a byte or short in C#) 为了满足我自己对使用“适当大小”整数与“优化”整数的优缺点的好奇心,我编写了以下代
以下布局在每个浏览器(Firefox、Chrome、Opera)中都能正常工作,Internet Explorer 8 除外: HTML:
我是一名优秀的程序员,十分优秀!