byte[] buf = new byte[200000];//缓存区定义            
                StringBuilder str = new StringBuilder();//定义一个可变字符串长度的实例           
                socket.Receive(buf);//接受数据
                string receiveMsg = Encoding.UTF8.GetString(buf);//转换为字符串
                Array.Clear(buf, 0, buf.Length);//清空数组里面的数据
                string Nike = "字符串1";
                str.Append(Nike);//将字符串追加进去
                str.Append("字符串2");
                str.Append(receiveMsg);//加接受过来的字符串追加进str
                MessageBox.Show(str.ToString());//显示全部数据//问题就出现在MessageBox.Show(str.ToString());这句,弹出的信息框只显示字符串1。好像后面的字符串都会丢失一样!!!到底是什么原因呢?请高手们支招!!!按理说应该是显示“字符串1字符串2接受的数据”这样 可是现在只是显示“字符串1“

解决方案 »

  1.   

    我发下了一个问题 。这个程序中使用了索引器就会出现我说的这个错误 不知道这是为什么 public void GetMsg()
            {
                
                while (true)
                {
                    string Nike;
                    byte[] buf = new byte[200000];
                    StringBuilder str = new StringBuilder();            
                    socket.Receive(buf);
                    string receiveMsg = Encoding.UTF8.GetString(buf);
                    Array.Clear(buf, 0, buf.Length);//清空数组里面的数据
                      Nike = Arr[socket];//自定的一个索引器用来获得昵称的。只要加上这句程序就会出现上面所说的情况。str里面最后只剩下Nike。其他的数据都会丢失!
                    str.Append(Nike);
                    str.Append("说: ");
                    //Thread.Sleep(20);
                    str.Append(receiveMsg);
                    MessageBox.Show("收到信息 " + receiveMsg);//这里将str里面的数据显示出来!            }高手帮忙看看啊!!!谢谢
      

  2.   

    为什么要加索引器?可以用Directory代替
      

  3.   

    是这样的 我想做个聊天室学习学习!支持多人聊天的!我写了一个类,包含一个socket和string的私有变量。分别放置连接的socket和昵称然后我又写了一个用于索引上面这个类的索引器,可以根据socket索引昵称现在的主要问题是 我在新开的线程中引用了上面的这两个自定义的类就先我说的这些出错的地方!!
      

  4.   


    没有。我试了下,只要把下面这句注释掉,或者换成Nike = ”dddddd“(直接赋值)就没有出现我说的丢失后面字符串的情况!就是这句
          Nike = Arr[socket];//自定的一个索引器用来获得昵称的。只要加上这句程序就会出现上面所说的情况。str里面最后只剩下Nike。其他的数据都会丢失!
           
      

  5.   

    终于自己知道问题了!!是缓存区的大小问题   请问怎么动态的定义缓存区的数据大小? byte[] buf = new byte[20000] ;实际上可能用不了那么大 也可能超过了这个范围
       socket.Receive(buf);//接受数据
      

  6.   


    byte[] buf = new byte[2] ;                 // 定义一个缓冲区
    socket.Receive(buf, socket.Available, 0);  // 获得接收到的字节数
    buf = new byte[socket.Available];          // 根据字节数分配缓冲区
    socket.Receive(buf, socket.Available, 0);  // 读回所有数据
      

  7.   

    MessageBox.Show("收到信息 " + receiveMsg);//这里将str里面的数据显示出来!你要显示的是str的数据,但是为什么你写的是receivemsg?
      

  8.   


    接收端是把所有在通讯缓冲区中的未读取字节全都读取出来,累积在一起(比如在一个memorystream中),然后当缓冲区中的数据为0时,你的程序才应该去从这个累积的数据中逐一分析每一个单独的消息并进行处理。
      

  9.   

    不太明白楼上大哥的意思 比如我设置
    byte[] buf = new byte[20000] ;实际上可能用不了那么大 也可能超过了这个范围
    socket.Receive(buf);//接受数据我把byte[] buf = new byte[10];
    那么如果传过来的数据大于10了 那岂不是容纳不下了????如何理解您的上面的这句话呢?