TCP服务器接收数据的速度低于发送数据的速率

时间:2017-06-14 10:04:10

标签: android c sockets tcp

我面临一个奇怪的问题。我的TCP服务器有一个打印输出的打印行 每当我从TCP客户端接收数据时的缓冲区值。

我的TCP客户端将能够通过字节以双值发送缓冲区。在服务器接收时,将接收字节,并在打印行上输出值。

例如:

TCP Client send: "0.25"
TCP Server receive: "0.25"

但是,因为我的客户端能够控制数据发送的速度,所以当我发送的值太快时,服务器有时会收到连接在一起的值。

例如:

TCP Client send: "0.27"
TCP Client send: "0.53"
TCP Client send: "0.91"
TCP Server receive: "0.270.530.90"

但我期望的是:

TCP Server receive: "0.27"
TCP Server receive: "0.53"
TCP Server receive: "0.90"

有没有办法解决这个问题?

这是我在Android上的客户端发送数据

LoginActivity.getSocket().getOutputStream().write(String.valueOf(multiplier).getBytes());

这是我在服务器端接收数据。

while(1){
        nread = sl_Recv(clientSocket, buffer, sizeof(buffer)-1, 0);
        buffer[nread] = '\0';
        if(nread==0){
            UART_PRINT("Connection Lost!\n\r");
            UART_PRINT("Listening again...\n\r");
            clientSocket = sl_Accept(welcomeSocket, ( struct SlSockAddr_t *)&serverStorage, (SlSocklen_t*)&addr_size);
            if(clientSocket<0){
                sl_Close(welcomeSocket);
                sl_Close(clientSocket);
                ASSERT_ON_ERROR(ACCEPT_ERROR);
            }
            UART_PRINT("Successfully Connected!!!\n\r");
        }
        else if(nread==-1){
            ASSERT_ON_ERROR(RECV_ERROR);
        }
        else{
            if(atof(buffer)>=0 && atof(buffer)<=1){
                UART_PRINT("Data Received: %s\n\r",buffer);
            }
        }

    }

2 个答案:

答案 0 :(得分:1)

除非您有编码错误,否则您所描述的内容是不可能的,但您的期望是错误的。 TCP在优化网络使用方面遇到了很多麻烦,它为应用程序提供了字节流,而不是消息服务。您可能有任何期望它会将一个发送视为一条消息,并在接收完全没有基础时保留该消息边界。

编辑您的代码出现问题:

  1. 您忽略了流的结尾和错误。您需要检查nread的0和-1。
  2. 您还需要确保添加尾随空值不会超出缓冲区,最好使用sizeof buffer -1作为recv()调用中的长度。
  3. 发送它们时,你不会将这些数字分开,所以如果它们合并,就会得到错误的数值。
  4.   

    我发送换行符

    不,你不是:

    LoginActivity.getSocket().getOutputStream().write(String.valueOf(multiplier).getBytes());
    

    那里没有换行符,只有String值的字节(显然)为double

答案 1 :(得分:0)

感谢大家的帮助。我非常确定客户端的套接字在发送数据时有延迟,或者服务器端在接收数据时有延迟。

我在我的android上将这行代码添加到了我的客户端。

socket.setTcpNoDelay(true);

我的计划按照我的预期运作。不确定使用它是否会产生任何负面影响,但之后我似乎没有遇到任何问题。