客户端  private void button2_Click(object sender, EventArgs e)
        {
            Connect(); //这里我第一次点击后能从服务器获得数据,第二次及以后就异常了  为什么?
//高手解答
        }
        private void Connect()
        {
            try
            {
                string ServerIp = "127.0.0.1";//服务器地址 
                int ServerPort = 1000;//服务器端口号 
                TcpClient TC = new TcpClient();
                TC.Connect(ServerIp, ServerPort);//建立与服务器的连接 
                NetworkStream stm = TC.GetStream();//通过tcp 
                UTF8Encoding UTF8 = new UTF8Encoding();
                byte[] str = UTF8.GetBytes(this.textBox1.Text);//把输入的内容编码
                stm.Write(str, 0, str.Length);//向服务器发送信息                 byte[] bb = new byte[10240];//接收服务器返回的数据
                int k = stm.Read(bb, 0, 10240);
                string RevStr = string.Empty;
                RevStr = System.Text.UTF8Encoding.UTF8.GetString(bb, 0, k);//转换
                this.textBox2.Text += RevStr;//连续显示在TEXTBOX内
                stm.Close();
                TC.Close();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
服务器   private TcpListener TL = null;
        private System.Net.IPEndPoint qSerIpendPoint;
        private Thread qSerTh; 
        private void Form1_Load(object sender, EventArgs e)
        {
            Start();
        }
        private void Start()
        {
            try
            {
                int IpPort = 1000;
                string Ip = "127.0.0.1";
                IPAddress Address = IPAddress.Parse(Ip);//
                qSerIpendPoint = new IPEndPoint(Address, IpPort);
                TL = new TcpListener(qSerIpendPoint);//准备监听
                TL.Start();//开始
                qSerTh = new Thread(new ThreadStart(Receive));
                qSerTh.Start();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void Receive()
        {
            try
            {
                Socket socket;
                socket = TL.AcceptSocket();
                string RemoteEndPoint = socket.RemoteEndPoint.ToString();
                Byte[] Stream = new Byte[10240];
                socket.Receive(Stream);//接收传来的值 
               // UTF8Encoding ServerReceiveStr = new UTF8Encoding();
                socket.Send(Stream);//向客服端发送一个回复信息 
                socket.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        } 在客户端的文本框输( this.textBox1.Text )入内容后我第一次点击后能从服务器获得数据并能在 this.textBox2.Text显示,
第二次及以后就异常了  为什么?
高手解答

解决方案 »

  1.   

    服务器端Receive()方法需要加个while(true){try..........}问题原因是服务器那边的连接已经释放掉了,所以下次再用就会异常
      

  2.   

    另外客户端那边每次发送完最好能调用一次stm.Flush()
      

  3.   

    http://www.cnblogs.com/JimmyZhang/archive/2008/09/07/1286300.html
      

  4.   


    你的错误是服务端的线程侦听到一个链接后就退出了,导致第二次请求无法响应.
    服务端
    :
     private void Receive()
            {
                while (true)
                {
                    try
                    {
                        Socket socket;
                        socket = TL.AcceptSocket();
                        string RemoteEndPoint = socket.RemoteEndPoint.ToString();
                        Byte[] Stream = new Byte[10240];
                        socket.Receive(Stream);//接收传来的值 
                        // UTF8Encoding ServerReceiveStr = new UTF8Encoding();
                        socket.Send(Stream);//向客服端发送一个回复信息 
                        socket.Close();
                        //socket.Disconnect(true);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    Thread.Sleep(100);
                }
            } 
    客户端其实不改也没问题,只是资源最好释放干净 private TcpClient TC;
            private NetworkStream stm;
            private void button3_Click(object sender, EventArgs e)
            {
                //if (TC==null||!TC.Connected)
                //{
                    Connect();
                //}
                //Send();
            }
            private void Connect()
            {
                try
                {
                    string ServerIp = "127.0.0.1";//服务器地址 
                    int ServerPort = 1000;//服务器端口号 
                     TC = new TcpClient();
                    TC.Connect(ServerIp, ServerPort);//建立与服务器的连接 
                     stm = TC.GetStream();//通过tcp 
                     UTF8Encoding UTF8 = new UTF8Encoding();
                     byte[] str = UTF8.GetBytes(this.textBox1.Text);//把输入的内容编码
                     stm.Write(str, 0, str.Length);//向服务器发送信息 
                     byte[] bb = new byte[10240];//接收服务器返回的数据
                     int k = stm.Read(bb, 0, 10240);
                     string RevStr = string.Empty;
                     RevStr = System.Text.UTF8Encoding.UTF8.GetString(bb, 0, k);//转换
                     this.textBox2.Text += RevStr;//连续显示在TEXTBOX内
                     
                     stm.Close();
                     TC.Close();
                   
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
      

  5.   

    异常提示什么?
    写法有点奇怪,客户段没有用SOCKET。
      

  6.   

    不可能啊,我这里明明可以的.我再贴一遍你复制全了.
    客户端:        private TcpClient TC;
            private NetworkStream stm;
            private void button3_Click(object sender, EventArgs e)
            {
                //if (TC==null||!TC.Connected)
                //{
                    Connect();
                //}
                //Send();
            }
            private void Connect()
            {
                try
                {
                    string ServerIp = "127.0.0.1";//服务器地址 
                    int ServerPort = 1000;//服务器端口号 
                     TC = new TcpClient();
                    TC.Connect(ServerIp, ServerPort);//建立与服务器的连接 
                     stm = TC.GetStream();//通过tcp 
                     UTF8Encoding UTF8 = new UTF8Encoding();
                     byte[] str = UTF8.GetBytes(this.textBox1.Text);//把输入的内容编码
                     stm.Write(str, 0, str.Length);//向服务器发送信息 
                     byte[] bb = new byte[10240];//接收服务器返回的数据
                     int k = stm.Read(bb, 0, 10240);
                     string RevStr = string.Empty;
                     RevStr = System.Text.UTF8Encoding.UTF8.GetString(bb, 0, k);//转换
                     this.textBox2.Text += RevStr;//连续显示在TEXTBOX内
                     
                     stm.Close();
                     TC.Close();
                   
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    服务端 private TcpListener TL = null;
            private System.Net.IPEndPoint qSerIpendPoint;
            private Thread qSerTh;
            private void button1_Click(object sender, EventArgs e)
            {
                Start();        }
            private void Start()
            {
                try
                {
                    int IpPort = 1000;
                    string Ip = "127.0.0.1";
                    IPAddress Address = IPAddress.Parse(Ip);//
                    qSerIpendPoint = new IPEndPoint(Address, IpPort);
                    TL = new TcpListener(qSerIpendPoint);//准备监听
                    TL.Start();//开始
                    qSerTh = new Thread(new ThreadStart(Receive));
                    qSerTh.IsBackground = true;
                    qSerTh.Start();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            private void Receive()
            {
                while (true)
                {
                    try
                    {
                        Socket socket;
                        socket = TL.AcceptSocket();
                        string RemoteEndPoint = socket.RemoteEndPoint.ToString();
                        Byte[] Stream = new Byte[10240];
                        socket.Receive(Stream);//接收传来的值 
                        // UTF8Encoding ServerReceiveStr = new UTF8Encoding();
                        socket.Send(Stream);//向客服端发送一个回复信息 
                        socket.Close();
                        //socket.Disconnect(true);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    Thread.Sleep(100);
                }
            } 
    我的是VS2008,不过设置成FM2.0编译的