1. 程式人生 > >實現動態系統托盤圖標

實現動態系統托盤圖標

系統 模式 sse threads lose read 斷線 ethos 寫入

實現效果:

  技術分享圖片

知識運用:

  TcpListener TcpClient 和 NetworkStream類 及 Timer組件

  1> TcpListener類    //用來從Tcp網絡客戶端偵聽連接

  技術分享圖片

  2> TcpClient類    //為Tcp網絡服務提供客戶端連接

  public TcpClient(string hostname,int port)  //遠程主機的DNS名 端口號

  3> NetworkStream類  //提供在阻止模式下通過Stream套接字發送和接受數據的方法

    //其Read方法用於從NetworkStream類讀取數據

  public override int Read(byte[] buffer,int offset,int size)

  技術分享圖片

  4> notifyIcon控件的Icon屬性

實現代碼:

        //該方法用於監聽指定端口  並通過該端口發送消息
        private void StartListen()
        {
            tcpListener = new TcpListener(888);                                     //創建TcpListener對象
            tcpListener.Start();                                                //開始監聽
            while (true)
            {
                TcpClient client = tcpListener.AcceptTcpClient();                    //接受連接請求
                NetworkStream nstream = tcpListener.AcceptTcpClient().GetStream();   //獲取數據流
                byte[] mbyte = new byte[1024];                                        //建立緩存
                int i = nstream.Read(mbyte, 0, mbyte.Length);                         //將數據流寫入緩存
                message = Encoding.Default.GetString(mbyte, 0, i);                    //獲取傳輸的內容
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                //IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName()); //獲取本機地址
                string message = "幹得好,賞啤酒一箱";                   //傳輸的內容
                TcpClient client = new TcpClient(textBox1.Text, 888);    //創建TcpClient對象
                NetworkStream netstream = client.GetStream();           //創建NetworkStream對象
                StreamWriter wstream = new StreamWriter(netstream, Encoding.Default);    //創建StreamWriter對象
                wstream.Write(message);                                                 //將信息寫入流
                wstream.Flush();
                wstream.Close();                                                        //關閉流
                client.Close();                                                         //關閉TcpClent對象
            }
            catch (Exception ex) { MessageBox.Show(ex.ToString()); }
        }

        bool k = true;                                                        //一個標記用於控制圖標閃動
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (message.Length > 0)
            {                                           //如果網絡中傳輸了數據
                notifyIcon1.Text = message;
                if (k)
                {
                    notifyIcon1.Icon = Properties.Resources._1;                 //托盤圖標為1
                    k = false;
                }
                else
                {
                    notifyIcon1.Icon = Properties.Resources._2;                 //托盤圖標為2
                    k = true;
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            td = new Thread(new ThreadStart(this.StartListen));                 //通過線程調用StartListen方法
            td.Start();                                                         //開始運行線程
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (tcpListener != null)
            {
                tcpListener.Stop();                                              //停止偵聽對象
            }
            if (td != null)
            {
                if (td.ThreadState == ThreadState.Running)                       //判斷線程是否運行
                    td.Abort();                                                 //終止線程
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            message = "";                                                       //清空傳輸內容
        }

實現動態系統托盤圖標