C#客户端无法重新启动服务器

时间:2014-10-20 19:30:14

标签: c# sockets asynchronous tcpclient

我有一个连接到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时,我无法理解为什么会这样。

1 个答案:

答案 0 :(得分:0)

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

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

假设$字符是协议的分隔符,您应该更改服务器端,以便服务器继续从接收缓冲区一直读取数据,并处理每个$ - 作为单个请求的定界部分。

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