我有一个连接到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从流中读取数据。
这仅在我在客户端添加至少一秒的睡眠时才有效。如果我删除了那个睡眠,我看到客户端能够同时触发两个请求,但是仍然无法读取第二个receiveFrame。
在服务器端,我看到第一个触发器进入,但第二个触发器没有通过。当处理传感器数据的时间仅为10-15ms时,我无法理解为什么会这样。
答案 0 :(得分:0)
第二个已经通过了,但你的代码没有注意到,因为你没有检查Read()方法的返回值,看看有多少数据是实际可用。
当客户端足够快地发送请求时,它们会合并为单个传输,并且只需一次调用Read()即可获得这两个请求。但是你的代码只检查该传输中的第一个请求,并将丢弃第二个请求。
假设$
字符是协议的分隔符,您应该更改服务器端,以便服务器继续从接收缓冲区一直读取数据,并处理每个$
- 作为单个请求的定界部分。
如果$
字符不是分隔符,那么您需要决定将用于分隔符的内容并包含您的协议。