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

C#客户端无法背靠背触发服务器,c#,sockets,asynchronous,tcpclient,C#,Sockets,Asynchronous,Tcpclient,我有一个Kinect传感器连接到一台电脑,我的应用程序正在通过驻留在另一台电脑上的TCP连接请求帧。我的问题是我无法触发两个请求并背靠背获取帧 这是连接到传感器的服务器端的代码: while(running) { if (networkStreamReceive.DataAvailable) { byte[] clientRequest = new byte[8]; networkStreamReceive.Read(clientRequest,

我有一个Kinect传感器连接到一台电脑,我的应用程序正在通过驻留在另一台电脑上的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-15毫秒时,我无法理解为什么会出现这种情况

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

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

假设
$
字符是协议的分隔符,您应该更改服务器端,以便服务器继续从接收的缓冲区读取数据,直到最后,将每个
$
分隔的部分视为单个请求


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

您是否考虑过使用
ReadAllBytes
而不是此处的这一行
networkStreamReceive.Read(
networkStreamReceive是NetworkStream类型的对象,我没有看到ReadAllBytes函数。谢谢!这就是问题所在。我将客户端更改为:byte[]clientRequest=new byte[2]这就成功了!如果您确信消息总是只有两个字符长,这是一种方法。但是,请记住,虽然在实践中不太可能,但从理论上讲,您的两个字符消息可能会被拆分为两个不同的单字节接收。对于任何奇怪的、难以解释的情况,您都可以100%确定如果您只是正确地编写了接收代码,那么会更好:检查返回代码并正确地处理接收到的任何数据量,无论是更多的、更少的,还是与您期望的完全相同的数据量。