gpt4 book ai didi

android - TCP 服务器接收数据的速度比发送数据的速度慢

转载 作者:行者123 更新时间:2023-11-30 20:20:52 26 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。我的 TCP 服务器有一个打印行,可以打印出每当我从 TCP 客户端接收数据时的缓冲区值。

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

例如:

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);
}
}

}

最佳答案

除非您有编码错误,否则您所描述的情况是不可能的,但您的期望是错误的。 TCP 在优化网络使用方面花费了很多精力,并且它向应用程序提供字节流,而不是消息服务。您可能期望它将一次发送视为一条消息并在接收时保留该消息边界,这是完全没有根据的。

编辑代码问题:

  1. 您忽略了流结束和错误。您需要检查 nread 是否为 0 和 -1。
  2. 您还需要确保添加尾随 null 不会超出缓冲区,最好使用 sizeof buffer -1 作为 recv()< 中的长度 调用。
  3. 您在发送数字时并未将它们分开,因此如果它们被合并(正如它们所发生的那样),您会得到错误的值。

I am sending newlines

不,你不是:

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

那里没有换行符,只有(显然)doubleString 值的字节。

关于android - TCP 服务器接收数据的速度比发送数据的速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44541592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com