socket tcp客户端接收数据,如何处理汉字被拆分?
比如目前接收的数据样例如下
第一次接收:
<+++>
设备告警流水?
第二次接收:
? = 21699
网络流水号 = 739641
这里第一次和第二次的是“号”,但服务端发过来后,“号”是被拆分到两次发过来的
客户端应该如何处理呢?
------解决方案--------------------http://topic.csdn.net/u/20111129/22/737b7a52-417b-4aae-865e-425a9b87b59d.html
------解决方案--------------------
增加一个结束符,读到结束符后合并前面记录的Byte数组,然后再转成字符串
------解决方案--------------------
把它放进一个临时变量1,判断数据位长:如果位长是基数,取位长-1,输出显示,把最后一位放进另外一个临时变量2;第二次接收,利用前面临时变量2,整合,完整输出。
------解决方案--------------------1、建议缩短参数名,毕竟是通讯
2、
------解决方案--------------------
循环,读取到一个缓存区中,我一般读到一个MEMOSTREAM中,然后,读取完后,再还源出数据~~~
如何判断读取完成,如果是长连接,可以在传输数据时规定一个开始、结束标志;如果不是,发送完成后,可以关闭SOCKET,然后有个READBUFFER == 0 (这个有点记不清了)可以判断传输己经结束。此时可以去MEMOSTREAM中读取并还原数据
------解决方案--------------------局域网局域网局域网局域网
------解决方案--------------------C/C++ code
看下这个函数
bool MySocket::reciveMsg(int socket, std::string& s, bool *eof)
{
const int READ_SIZE = 4096; // Number of bytes to attempt to read at a time
char readBuf[READ_SIZE];
bool wouldBlock = false;
*eof = false;
while ( ! wouldBlock && ! *eof) {
int n = recv(socket, readBuf, READ_SIZE-1, 0);
if (n > 0) {
readBuf[n] = 0;
s.append(readBuf, n);
} else if (n == 0) {
*eof = true;
} else if (GetError()) {
wouldBlock = true;
} else {
return false; // Error
}
}
return true;
}
------解决方案--------------------
------解决方案--------------------
StreamReader 这个类专门就干这事的。如果你想自己反编译一下看看源码。我觉得蛮复杂的。