我有用C / C ++编写的服务器,客户端是用在android上运行的Java。
服务器看起来像
C ++服务器
#define ETH_DATA_LENGTH 25
bzero(buf,ETH_DATA_LENGTH);
rd=read(newsockfd,buf,ETH_DATA_LENGTH);
if(rd>0){
printf("received %s\n", buf);
char cmd[ETH_DATA_LENGTH]={0};
sprintf(cmd,"%s",buf);
//setCommand(cmd);
}
android客户端发送格式为5_11_14_, 5_11_15_, 5_11_16_,etc...
的数据包,如果客户端在每个数据包中有延迟,则服务器会正确接收数据。但是当客户端连续发送时,我会得到一些额外的字符,看起来像
received 5_11_9_
received 5_11_10_
5_11_11_
5_11_12�ڳ
received _
received 5_11_13_
在android方面,我发送的数据如
Java客户端
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientsocket.getOutputStream())),true);
out.println(str);
知道为什么会这样吗?
提前致谢....
答案 0 :(得分:4)
有两件事:您收到的数据是而不是零终止,换句话说,您不能将其用作字符串。另一种是当你要求读取25个字节时,它最多可以读取25个字节或更少。您需要拥有某种记录分隔符,或预先发送长度。
你看到的问题(“垃圾”)是因为第一个问题。 printf
只会从buf
中获取字符,直到它到达字符串终结符'\0'
。如果找不到,那么printf
将继续,甚至从缓冲区中读取字符。
对此的简单解决方案是将缓冲区大小增加1(以适应终结符),接收比缓冲区大小少一个字节(例如sizeof(buf) - 1
),并在成功read
调用之后终止输入:
buf[rd] = '\0';