我的程序很奇怪,第一次点击按钮button1_Click很正常,第二次点击按钮button1_Click程序就没有响应了,好像还陷入死循环了,不知道什么原因,请各位大大帮我解惑,下面附源代码:服务端:        public Form1()
        {
            InitializeComponent();
                //开始启动服务器
                try
                {
                    thread1 = new Thread(new ThreadStart(Listen));
                    thread1.Start();
                }
                catch
                {
                }
        }        //监听程序
        private void Listen()
        {
            string tmp4;    //命令返回值
            try
            {
                //创建一个tcpListener对象,此对象主要是对给定端口进行侦听
                tcpListener = new TcpListener(7981);
                //开始侦听
                tcpListener.Start();
                //返回可以用以处理连接的Socket实例
                socketForClient = tcpListener.AcceptSocket();
                //如果返回值是"true",则产生的套节字已经接受来自远方的连接请求 
                if (socketForClient.Connected)
                {
                    //已经和客户端成功连接
                    while (true)
                    {
                        //创建networkStream对象通过网络套节字来接受和发送数据
                        networkStream = new NetworkStream(socketForClient);
                        //从当前数据流中读取一行字符,返回值是字符串
                        streamReader = new StreamReader(networkStream);
                        string msg = streamReader.ReadLine();
                        tmp4 = mingling(msg);
                        streamWriter = new StreamWriter(networkStream);
                        //往当前的数据流中写入一行字符串
                            streamWriter.WriteLine(tmp4);
                         //刷新当前数据流中的数据
                            streamWriter.Flush();
                    }
                }
            }
            catch { }
        }
客户端:       //发送消息
       private void button1_Click(object sender, EventArgs e)
        {
            string tmp1 = listBox1.SelectedItem.ToString(); //主机名
            string tmp2 = listBox2.SelectedItem.ToString(); //选择的命令
            string tmp3 = "你好吗?";   //准备发送命令
            string tmp4 = "";   //主机返回值            //开始正式发送
            try 
            {
                myclient = new TcpClient(tmp1, 7981);
            }
            catch
            {
                richTextBox1.AppendText(tmp1 + "没有连接到!");
                return;
            }
            //创建networkStream对象通过网络套节字来接受和发送数据
            networkStream = myclient.GetStream();
            streamReader = new StreamReader(networkStream);
            streamWriter = new StreamWriter(networkStream); 
            //开始发送
            try
            {
                //往当前的数据流中写入一行字符串
                streamWriter.WriteLine(tmp3);
                //刷新当前数据流中的数据
                streamWriter.Flush();
                //从当前数据流中读取一行字符,返回值是字符串
                tmp4 = streamReader.ReadLine();
                //ListBox1.Items.Add("读取服务器端发送内容:" + s);
                richTextBox1.AppendText(tmp1 + "返回内容:" + tmp4);                
            }
            catch (Exception err)
            {
                richTextBox1.AppendText(tmp1 + "错误:" + err.ToString());
            }
        }

解决方案 »

  1.   

    你把开启服务器代码部分放在page_lode中试试看
      

  2.   


    string tmp1 = listBox1.SelectedItem.ToString(); //主机名查一下主机名是否设置正确?
      

  3.   

    不要用死循环
    定义一个布尔
    bool m_linked = false;
    // 开启侦听后把m_connected变为true
    while(m_linked)
    {
     断开链接的时候把m_connected变为flash
    }
      

  4.   

    很明显,服务器写得不正常!
    你的写法,服务器只能处理一个用户后,线程就停止了,并且在处理的时候,还会死掉(准确说是死循环了)。
    服务器端按照下面的来写:
    while(true)
    {
        aclient=tcpListener.AcceptSocket();//新客户
      {
       receive();       //你自己的业务功能
       send();
       }
    }
    在客户端:
    在连接之后,也就是你的按钮按下之后,你的函数执行一次返回成功后,第二次执行到myclient赋值语句时,对于服务器来说,是第二个客户了,而此时服务器在那边死循环了!!所以不响应客户的连接请求!
      

  5.   

    或者你在客户端对myclient做一下判断,如果已经连接,就不要再连接了,就是:            try 
                {
                    if(myclient==null)                           //添加一句判断
                    myclient = new TcpClient(tmp1, 7981);
                }
                catch
                {
                    richTextBox1.AppendText(tmp1 + "没有连接到!");
                    return;
                }
      

  6.   

    代码太少,你自己在 button1_Click() 里面用 Console.WriteLine("line “+i); 看看在那一行停住了吧