【问题标题】:C# client unable to trigger server back to backC#客户端无法触发服务器背靠背
【发布时间】:2014-10-20 19:30:13
【问题描述】:

我有一个连接到 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 从流中读取数据。

这仅在我在客户端添加至少一秒钟的睡眠时才有效。如果我删除该睡眠,我会看到客户端能够触发这两个请求,但在读取第二个接收帧时卡住了。

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

【问题讨论】:

  • 您是否考虑过在此处使用ReadAllBytes 而不是这一行networkStreamReceive.Read(
  • networkStreamReceive 是 NetworkStream 类型的对象,我没有看到 ReadAllBytes 函数。

标签: c# sockets asynchronous tcpclient


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢!这就是问题所在。我将客户端更改为: byte[] clientRequest = new byte[2] 成功了!
  • 如果您确定消息总是只有两个字符长,这是一种方法。但是,请记住,虽然在实践中极不可能发生,但理论上您的双字符消息可能会被拆分为两个不同的单字节接收。为了 100% 确定不会出现任何奇怪的、难以解释的错误,如果您正确编写接收代码会更好:检查返回代码并正确处理接收任何数量的数据,无论是更多、更少还是和你预期的完全一样。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
相关资源
最近更新 更多