我的socket接收的时候,是一个byte一个byte收的(这样做的原因是当收到值为3时,可以及时发出值6。这个规则是对方服务器自定的)。代码如下
        //另一个线程的无限循环接收
        private void RecevieMsg()
        {
            while (true)
            {
                byte[] buffer = new byte[1024];
                byte[] recevie = new byte[1];//一个一个接                socket.Receive(recevie);                if (recevie[0] == 3)//PMS发送“3”相当于PMS说完了一句话,等待程序对它进行回应(回应“6”)。
                {
                    byte[] ack = new byte[1];
                    ack[0] = 6;//回复给PMS6
                    socket.Send(ack);
                }
                //strRec += Encoding.ASCII.GetString(recevie);
            }
        }现在,我会不定时的收到服务器传过来的一些数据,例如下面这条长数据...****LS|DA100719|TI161039|****GI|RN3017|G#17277|GN(EN) Mr Messi|GLEA|GV1|**GO|RN1007|G#17277|GSN|***[/color]注:*代表一些无用信息,而区分句与句之间的标志是—>表示一句话的开始,表示一句话的结束。
比如根据和的标示,我知道了一句完整的话—〉LS|DA100719|TI161039|,我的目标就是将一句未知的长度的话,一句一句的分开。我的目标是—>
比如服务器传过来的是上面的例子长句(我用socket接收时是一个byte一个byte去接收的),我得到的第一句话是—>LS|DA100719|TI161039| ,然后用MessageBox.Show显示出来.
然后socket接着接收,得到第二句话—> GI|RN3017|G#17277|GN(EN) Mr Messi|GLEA|GV1| ,,然后用MessageBox.Show显示出来.
然后接着接收得到第三句话—>GO|RN1007|G#17277|GSN|,然后用MessageBox.Show显示出来.希望高手指点,万分感谢!!!!!

解决方案 »

  1.   

    bool flag = false;
                string str = null;
                if (receive[0].ToString() == "") 
                {   
                    flag = true;
                }            if (receive[0].ToString() == "")
                {
                    flag = false;
                }            if (flag)
                {
                    str += receive[0].ToString();
                }
                else if (receive[0] == 3) 
                {
                    str = null;
                    //... ...
                }
      

  2.   


            //接收
            private void RecevieMsg()
            {
                while (true)
                {
                    byte[] buffer = new byte[1024];
                    byte[] recevie = new byte[1];                socket.Receive(recevie);//WHILE循环,会一个位置一个位置去接收数据。                string str = null;
                    if (recevie[0] == 2)//一整句话的开始
                    {
                        flag = true;
                    }                if (recevie[0] == 3)//一整句话的结束
                    {
                        flag = false;
                    }                if (flag)
                    {
                        str += Encoding.ASCII.GetString(recevie);
                    }
                    else if (recevie[0] == 3)
                    {
                        byte[] ack = new byte[1];
                        ack[0] = 6;//回复给PMS6
                        socket.Send(ack);
                        MessageBox.Show(strRec);//以后改写成一个方法。
                        str = null;
                        flag = false;
                    }
                }
            }没什么问题吧,缓冲区的方法我在查资料。
      

  3.   

    修改一下,因为我不想要第一个字符 应该在  
     if (recevie[0] == 2)//一整句话的开始
    {
         flag = true;
    }
    改写成
     if (recevie[0] == 2)//一整句话的开始
    {
         flag = true;
         return;
    }
    对吧
      

  4.   

    这样的话 起始标识符和结束标识符都去掉了,对方服务器今天关了
    我在修改一个SOCKET服务器测试下
      

  5.   

    将flag的判断放在str输出的后面?
      

  6.   

    晕 写错了 , return直接结束while循环了是吧 我改下
      

  7.   

    要么
    if (flag && (receive[0].ToString!="")&& (receive[0].ToString!=""))
                    {
                        str += Encoding.ASCII.GetString(recevie);
                    }
                    else if (recevie[0] == 3)
                    {
                        byte[] ack = new byte[1];
                        ack[0] = 6;//回复给PMS6
                        socket.Send(ack);
                        MessageBox.Show(strRec);//以后改写成一个方法。
                        str = null;
                        flag = false;
                    }
      

  8.   


    你确定Return在你的函数中能够达到预期的目的吗?
      

  9.   

    调试通过        //接收
            private void RecevieMsg()
            {
                while (true)
                {
                    byte[] buffer = new byte[1024];
                    byte[] recevie = new byte[1];                socket.Receive(recevie);//WHILE循环,会一个位置一个位置去接收数据。                if (recevie[0] == 2)//一整句话的开始
                    {
                        flag = true;
                    }                if (recevie[0] == 3)//一整句话的结束
                    {
                        flag = false;
                    }                if (flag && recevie[0] != 2)//不想要""
                    {
                        str += Encoding.ASCII.GetString(recevie);
                    }
                    else if (recevie[0] == 3)
                    {
                        byte[] ack = new byte[1];
                        ack[0] = 6;//回复给PMS6
                        socket.Send(ack);
                        MessageBox.Show(str);//以后改写成一个方法。
                        str = null;
                    }
                }
            }