日期:2014-05-20  浏览次数:20796 次

socket tcp客户端接收数据,如何处理汉字被拆分?
比如目前接收的数据样例如下

第一次接收:
<+++>
设备告警流水?

第二次接收:
? = 21699
网络流水号 = 739641

这里第一次和第二次的是“号”,但服务端发过来后,“号”是被拆分到两次发过来的

客户端应该如何处理呢?

------解决方案--------------------
http://topic.csdn.net/u/20111129/22/737b7a52-417b-4aae-865e-425a9b87b59d.html
------解决方案--------------------
增加一个结束符,读到结束符后合并前面记录的Byte数组,然后再转成字符串
------解决方案--------------------
把它放进一个临时变量1,判断数据位长:如果位长是基数,取位长-1,输出显示,把最后一位放进另外一个临时变量2;第二次接收,利用前面临时变量2,整合,完整输出。
------解决方案--------------------
1、建议缩短参数名,毕竟是通讯
2、
探讨

增加一个结束符,读到结束符后合并前面记录的Byte数组,然后再转成字符串

------解决方案--------------------
循环,读取到一个缓存区中,我一般读到一个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;
}

------解决方案--------------------
探讨
http://topic.csdn.net/u/20111129/22/737b7a52-417b-4aae-865e-425a9b87b59d.html

------解决方案--------------------
StreamReader 这个类专门就干这事的。如果你想自己反编译一下看看源码。我觉得蛮复杂的。