当前位置:编程学习 > C#/ASP.NET >>

timer1_Tick中出现 “当前上下文中不存在名称client”错误

源码:
namespace 控件刷新
{
    public partial class Form1 : Form
    {

        PerformanceCounter pc = new PerformanceCounter("Processor", "% Processor Time", "_Total");   
        int recv; // 用于表示客户端发送的信息长度
           byte[] data = new byte[1024]; // 用于缓存客户端所发送的信息,通过socket传递的信息必须为字节数组
           
           IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); // 本机预使用的IP和端口
           Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
       
         
        public Form1()
        {
            InitializeComponent();  
            IPHostEntry ipe = Dns.GetHostEntry(Dns.GetHostName());

           IPAddress ipa = ipe.AddressList[1];

           newsock.Bind(ipep); // 绑定
        newsock.Listen(10); // 监听
 Socket client = newsock.Accept(); // 当有可用的客户端连接尝试时执行,并返回一个新的socket,用于与客户端之间的通信

           label4.Text =" waiting for a client  ";
        }

        private void timer1_Tick(object sender, EventArgs e)
        {         
           string cpuLoad = pc.NextValue().ToString("0.00");
           label1.Text = cpuLoad;
           Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); // 本机预使用的IP和端口
 
           
          
           IPEndPoint clientip = (IPEndPoint)client.RemoteEndPoint;
           Console.WriteLine(" connect with client: " + clientip.Address + "  at port: " + clientip.Port);
           string welcome = " welcome here! ";
           data = Encoding.ASCII.GetBytes(welcome);
           client.Send(data, data.Length, SocketFlags.None); // 发送信息
           
           // 用死循环来不断的从客户端获取信息
               data = new byte[1024];
               recv = client.Receive(data);
              
              label1.Text = Encoding.ASCII.GetString(data, 0, recv);
              string welcomee = " welcome here! ";
              data = Encoding.ASCII.GetBytes(welcomee);
              client.Send(data, data.Length, SocketFlags.None); // 发送信息
              
          
           //Console.WriteLine(" Disconnected from " + clientip.Address);
           //client.Close();
           //newsock.Close();



        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void label3_Click(object sender, EventArgs e)
        {

        }
    }
}
那个赋值语句还是只能运行一次,只能放在timer外面,怎么办?? --------------------编程问答-------------------- 吧那句放到timer中去 --------------------编程问答-------------------- 但是那个是socket链接的语句,只能连接一次就够了,不能放到timer中啊 --------------------编程问答-------------------- 这个不能用timer吧?你的accept是同步阴塞的,timer好像是多线程的运行, 也就是异步的。
如果没有Socket进来,那么client就没有啊, 你在Timer_tick里肯定取不到值

这两个不找搭边,你在Tick事件里加判断吧, 如果client可用{........}else{.........} --------------------编程问答-------------------- 换句话说,如果没有请求进来,你的主线程会停在client = socket.Accept()那句话上,但time的子线程仍然会执行tick事件,这时候client对象是没有的
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,