刚刚开始学习网络编程,做了一个服务器,和一个客户端对传数据
这是服务器的代码:
            TcpListener listener = new TcpListener(60000);
            listener.Start();
            while (true)
            {
                Socket mySocket = listener.AcceptSocket();
                NetworkStream ns = new NetworkStream(mySocket);
                StreamReader sr = new StreamReader(ns);
                string[] strRec = sr.ReadLine().Split(' ');
                string command = strRec[0] + textBox2.Text;
                byte[] message = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray());
                mySocket.Send(message);
                string endstring = "\r\n";
                byte[] endmessage = System.Text.Encoding.ASCII.GetBytes(endstring.ToCharArray());
                mySocket.Send(endmessage);
            }客户端的代码:
TcpClient myClient = new TcpClient(127.0.0.1,60000);
            NetworkStream ns = null;
            string message = textBox4.Text + "\r\n";
            byte[] sendmessage = System.Text.Encoding.ASCII.GetBytes(message.ToCharArray());
            ns = myClient.GetStream();
            StreamReader sr = new StreamReader(ns);
            ns.Write(sendmessage, 0, sendmessage.Length);
            string text = "";
            while (true)
            {               
                text = sr.ReadLine();
                if(text.Equals(""))
                {
                    break;
                }
                textBox1.Text = text;
            }
            myClient.Close();运行得不到我要的结果,追踪调试发现,服务器能接收到客户端发的数据,但是客户端接收不到服务器发出的数据,text = sr.ReadLine()读的是空值,哪位大哥帮我看看,是哪出了问题啊

解决方案 »

  1.   

    因为你的循环是不停在运行的,你接受到数据的一霎那,文本框闪了一下填入数据,就被后面的循环把数据重新写成 “” 了。呵呵while (true) 
                {              
                    text = sr.ReadLine(); 
                    if(text.Equals("")) 
                    { 
                        break; 
                    }
                    
                    textBox1.Text += text; 
                } 
      

  2.   

    textBox1.Text = text; 楼上正解!!!
      

  3.   

    是要改成textBox1.Text += text,这是个原因,但是运行出问题,调试text = sr.ReadLine(); 循环的第一次能获取到服务器发送的message,但是第二次循环却获取不到endmessage,在text = sr.ReadLine()这按F11都没反应了。。
      

  4.   

               while (true)
                {
                  //text可能读到的为null,这时调用Equals方法就会出现异常{"未将对象引用设置到对象的实例。"},改成下面这样就可以了
                    text = sr.ReadLine();
                     if (text==null)
                    {
                        break;
                    }                  
                   textBox1.Text += text; 
                } 
      

  5.   

     while (sr.EndOfStream==false)
    {
    }进行判断来试试
      

  6.   

    服务器端不要使用StreamRead和StreamWrite,直接使用准确地对byte[]缓冲区操作的方法最可靠。大致按照你的思路,可以改为:TcpListener listener = new TcpListener(60000);
    listener.Start();
    while (true)
    {
        using (TcpClient ac = listener.AcceptTcpClient())
        {
            NetworkStream ns = ac.GetStream();
            MemoryStream dest = new MemoryStream();
            int n;
            byte[] buffer = new byte[4096];
            while (ns.DataAvailable && (n = ns.Read(buffer, 0, buffer.Length)) >= 0)
                dest.Write(buffer, 0, n);
            string[] strRec = Encoding.UTF8.GetString(dest.ToArray()).Split(' ');
            string command = strRec[0] + textBox2.Text;
            buffer = Encoding.UTF8.GetBytes(command);
            ns.Write(buffer, 0, buffer.Length);
        }
    }和
    using (TcpClient myClient = new TcpClient("127.0.0.1", 60000))
    {
        NetworkStream ns = myClient.GetStream();
        new StreamWriter(ns).Write(textBox4.Text);
        textBox1.Text = new StreamReader(ns).ReadToEnd();
    }
    实际上,业务服务程序最好完全使用异步的操作,以免因为个别操作延迟影响其它任务。而且,服务器端程序通常也需要注意捕获和处理异常。
      

  7.   

    要想在服务器端返回值的后边加上换行回车,直接写    string command = strRec[0] + textBox2.Text + "\r\n";这就可以了,不要分两次写到NetworkStream。