2014-10-20 52 views
2

我有一台Kinect传感器连接到PC,我的应用程序通过另一台PC上的TCP连接请求帧。我的问题是,我无法触发两个请求并将帧重新连接。C#客户端无法触发服务器连接

这是在其被连接到所述传感器上的服务器侧的代码:

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。

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

+0

你有没有考虑这样做,而不是这条线在这里了''ReadAllBytes' networkStreamReceive.Read(' – MethodMan 2014-10-20 19:31:12

+0

networkStreamReceive是一个类型的NetworkStream的对象,我没有看到一个ReadAllBytes功能。 – trycatch22 2014-10-20 19:35:57

回答

0

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

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

假设$字符是作为协议的分隔符,则应该改变你的服务器侧,使得服务器继续从接收缓冲器读出的数据一路到底,把每个$ -delimited部分作为单个请求。

如果$字符不是分隔符,那么您将需要决定将用于分隔符的内容并包含您的协议。

+0

谢谢!这是问题。我改变客户端到: byte [] clientRequest = new byte [2] 而且工作! – trycatch22 2014-10-20 19:59:12

+0

如果您确定邮件总是只有两个字符长,这是一种方法,但请记住,虽然在实践中难以置信的是,但理论上可能的是,你的双字符消息会被分成两个不同的单字节接收。为了100%确定对任何奇怪的,难以解释的错误,如果你只是正确地写了接收代码:检查返回代码并正确处理接收任何数量的数据,无论是更多,更少,还是完全相同。 – 2014-10-20 21:56:39