我面临一个奇怪的问题。我的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);
}
}
}
答案 0 :(得分:1)
除非您有编码错误,否则您所描述的内容是不可能的,但您的期望是错误的。 TCP在优化网络使用方面遇到了很多麻烦,它为应用程序提供了字节流,而不是消息服务。您可能有任何期望它会将一个发送视为一条消息,并在接收完全没有基础时保留该消息边界。
编辑您的代码出现问题:
nread
的0和-1。 sizeof buffer -1
作为recv()
调用中的长度。我发送换行符
不,你不是:
LoginActivity.getSocket().getOutputStream().write(String.valueOf(multiplier).getBytes());
那里没有换行符,只有String
值的字节(显然)为double
。
答案 1 :(得分:0)
感谢大家的帮助。我非常确定客户端的套接字在发送数据时有延迟,或者服务器端在接收数据时有延迟。
我在我的android上将这行代码添加到了我的客户端。
socket.setTcpNoDelay(true);
我的计划按照我的预期运作。不确定使用它是否会产生任何负面影响,但之后我似乎没有遇到任何问题。