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

请教 StringBuffer 使用问题,在线等!!!
背景:客户端通过TCP连接从服务器接收字串,要把收到的字符串根据指定的分割标志(H#H)分开,然后一条一条进行处理。
            服务器每次发过来的消息的长度不会少于150,最长不确定。
            用于接收消息的bData长度是4K,目前一次最多收到的消息没有大于3K长度的。
代码如下:
        try{
            int     iLen   =   0;
            int     iPos1   =   0;
            int     iPos2   =   0;
            String   sTmp   =   null;
            while(true   &&   chkFlg){
                iLen   =   IS.read(bData);
                if   (   iLen   >   0)   {
                    sTmp   =   new   String(   bData);
                    sTmp   =   sTmp.trim();
                    strBuf.append(sTmp);
                    iPos1   =   strBuf.indexOf( "H#H ");
                    iPos2   =   strBuf.indexOf( "H#H ",iPos1+100);
                    while(   iPos1> -1   &&   iPos2> iPos1   ){
                        sTmp   =   strBuf.substring(iPos1,iPos2);
                        strBuf.delete(iPos1,   iPos2);
                        //把消息放到任务线程中去处理
                        dealMsg(sTmp);
                        iPos1   =   strBuf.indexOf( "H#H ");
                        iPos2   =   strBuf.indexOf( "H#H ",iPos1+100);
                    }
                    //用“\0”清理掉用于接收消息的bData中的内容
                    System.arraycopy(bDump,0,bData,0,iBufSize);
                }
                if   (   iLen==-1   )   {
                    break;
                }
            }
        }
        catch(IOException   e){
        }
代码处理逻辑:服务器每次发过来的append在StringBuffer最后,看到第二个分割符号时,把前边的一条地取出来处理。
环境:服务器在Linux上,客户端所在机器的操作系统不定。
问题:当客户端在Windows上跑或者和服务器放在同一台Linux上时,不论分割符间的串有多短或者多长都正常;
            但客户端放到另外一台Linux上就不行了,发过来的全是短些的串没有问题,长的串(比如大于2000的)就会出错,但又不是每次都错,有时候错得多,有时候对的多:
            出错情况1、有长串时,一次没有发完,下次才会发完,发现前一次没有处理留在StringBuffer中的串整个儿没有了,里边的内容全成了第二次发过来的了:
                    第一次过来的:H#H111111H#H2222222(近1500字符),不知道第二个串有没有结束所以只从StringBuffer中处理并delete掉第一条完整的内容,这个时候看StringBuffer里的内容,是H#H2222222....,是正确的没有处理的未完的内容。