大家好:
    最近我做了一个socket程序,遇到了一个奇怪的问题,希望大家给我提点意见。
    因为是对服务器进行测试,我必须在客户端模拟多用户进行访问。
    多用户连接服务器没有问题,所以我就直接就发送与接收两个方面向大家咨询意见。    发送指令,用的是同步方式,用了多线程,如下:
     int num=0;
     Thread[] ThreadTest = new Thread[3];
     Socket[] sock = new Socket[20];
     Socket[] client = new Socket[20];
     string RecContent = string.Empty;
     private const int BufferSize = 256;
     private byte[] buffer = new byte[BufferSize];     private void ThreadStartReg()
     {
            try
            {
                Encoding en = System.Text.Encoding.UTF8;
                byte[] lt = en.GetBytes("命令");
                sock[num].Send(lt, lt.Length, 0);
            }
            catch { }
      }      private void btn_Command_Test_Click(object sender, EventArgs e) //按钮事件,发送命令
      {
               for (int i = 0; i < 3; i++)
                {
                    num = i;
                    ThreadTest[i] = Thread(new ThreadStart(ThreadStartReg));
                    ThreadTest[i].Start();
                }
      }      接收用的是异步:
      private void btn_SearchInfo_Click(object sender, EventArgs e)
      {
        for (int i = 0; i <3; i++)
        {
                num = i;
                ReceiveData(i);
                Thread.Sleep(2000);
                if (RecContent != "")
                {
                    rtbReceive.Text += "\r\n" + "客户端 " + (i + 1) + "\r\n";
                    rtbReceive.AppendText(RecContent);   //向控件rtbReceive装载反馈数据
                }
                RecContent = "";
         }
      }      private void ReceiveData(int i)
        {
            try
            {
                sock[i].BeginReceive(buffer, 0, BufferSize, SocketFlags.None, new AsyncCallback                                (ReceiveCallBack), sock[i]);
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message);
            }
        }        private void ReceiveCallBack(IAsyncResult ar)
        {
            client[num] = (Socket)ar.AsyncState;
            try
            {
                int bytesRead =client[num].EndReceive(ar);//结束挂起的异步读取。返回接收到的字节数。
                if (bytesRead > 0)
                {
                    string content = Encoding.UTF8.GetString(buffer, 0, bytesRead); //转换为字符串
                    client[num].BeginReceive(buffer, 0, BufferSize, 0, new AsyncCallback(ReceiveCallBack),                     client[num]);
                    RecContent += content;
                }
                else
                {
                    client[num].Shutdown(SocketShutdown.Both);
                    client[num].Close();
                }           
            }
            catch (Exception ex)
            { 
                MessageBox.Show(this, ex.Message, "Unusual error druing Recieve!"); 
            }
        }
其中,当服务器返回给客户端的内容较长时,长度大概在7000以上,在模拟多用户时,只能返回服务器给客户端1的数据,其他客户端都接收不到。当服务器返回给客户端的内容不长时,几个客户端都能收到,什么原因,跪求解决!!!!!!!  

解决方案 »

  1.   

    代码有问题, 运行到ReceiveData时num值不符合程序逻辑要求 for   (int   i   =   0;   i   <   3;   i++) 
     { 
       num   =   i;  // 走完循环后num值一直保持为2,所有的ReceiveData里面的num一直为2
       ThreadTest[i]   =   Thread(new   ThreadStart(ThreadStartReg));
       ThreadTest[i].Start(); 
      

  2.   

    代码有问题, 运行到ReceiveData时num值不符合程序逻辑要求 for   (int   i   =   0;   i   <   3;   i++) 
     { 
       num   =   i;  // 走完循环后num值一直保持为2,所有的ReceiveData里面的
       ThreadTest[i]   =   Thread(new   ThreadStart(ThreadStartReg));
       ThreadTest[i].Start(); 
    } ////////////////////你试试下面这个
    int   num=0; 
    Thread[]   ThreadTest   =   new   Thread[3]; 
    Socket[]   sock   =   new   Socket[20]; 
    Socket[]   client   =   new   Socket[20]; 
    string   RecContent   =   string.Empty; 
    private   const   int   BufferSize   =   256; 
    private   byte[]   buffer   =   new   byte[BufferSize]; 
    private const int MAX_BUFFER_SIZE = 1<<20;private void ThreadProc(object statenum)
    {
    int num = (int) statenum;
    int i = num;
    byte[] buffer = new byte[MAX_BUFFER_SIZE];
    Encoding   en   =   System.Text.Encoding.UTF8; 
        byte[]   lt   =   en.GetBytes("命令"); 
        sock[num].Send(lt,   lt.Length,   0);  // 同步访问应该最好同步接收
    int bytesreceived = sock[num].Receive(buffer, 0, MAX_BUFFER_SIZE);
    string s = Encoding.UTF8.GetString(buffer, 0, bytesreceived);
    s = "\r\n"   +   "客户端   "   +   (i   +   1)   +   "\r\n" + s;
    this.Invoke(new d(this.ShowResult), new object[]{s}); // 利用这个函数转到UI线程
    }private delegate void d(string s);private void ShowResult(string s)
    {
    if (s != null)
    {
    rtbReceive.Text   +=   "\r\n"   +   "客户端   "   +   (i   +   1)   +   "\r\n"; 
            rtbReceive.AppendText(s);       //向控件rtbReceive装载反馈数据
    }
    }            private   void   btn_Command_Test_Click(object   sender,   EventArgs   e)   //按钮事件,发送命令 
                { 
                                  for   (int   i   =   0;   i   <   3;   i++) 
                                    { 
    ThreadPool.QueueUserWorkItem(new WaitCallback(this.ThreadProc), (System.Int32)i);
                                    } 
                }