C#實現確保單程式類

iDotNetSpace發表於2009-07-29
通過監聽本地設定的TCP埠實現,無網路卡也沒問題。解決防火牆問題,不會彈出防火牆詢問。

 1C#實現確保單程式類/*------------------------------------------
 2* 模組名稱:確保單程式類
 3* 設計作者:張鵬
 4* 設計日期:2009-6-4
 5* 備註:大風扇吹空香皂盒
 6*------------------------------------------*/

 7using System;
 8using System.Collections.Generic;
 9using System.Text;
10using System.Net.Sockets;
11using System.IO;
12using System.Threading;
13using System.Net;
14
15namespace aaaSoft
16C#實現確保單程式類{
17C#實現確保單程式類    /// 
18    /// 單程式類
19    /// 

20    class SingleProcess
21C#實現確保單程式類    {
22        private string GuidString;
23        private int TcpPort;
24        private TcpListener listener;
25
26C#實現確保單程式類        /// 
27        /// 建構函式
28        /// 
29        /// 唯一識別符號
30        /// 監聽TCP埠號

31        public SingleProcess(string GuidString, int TcpPort)
32C#實現確保單程式類        {
33            this.GuidString = GuidString;
34            this.TcpPort = TcpPort;
35        }

36
37C#實現確保單程式類        /// 
38        /// 當第二程式執行時引發
39        /// 

40        public event EventHandler SecondProcessStart;
41
42C#實現確保單程式類        /// 
43        /// 開始確保單程式
44        /// 

45        public void Start()
46C#實現確保單程式類        {
47            try
48C#實現確保單程式類            {
49                listener = new TcpListener(IPAddress.Parse("127.0.0.1"), TcpPort);
50                listener.Start();
51                Thread trdListen = new Thread(Run);
52                trdListen.Start();
53            }

54            catch
55C#實現確保單程式類            {
56                //說明已經有例項存在
57                TcpClient client = new TcpClient();
58                client.Connect("127.0.0.1", TcpPort);
59                NetworkStream ns = client.GetStream();
60                byte[] buffer = Encoding.Default.GetBytes(GuidString);
61                ns.Write(buffer, 0, buffer.Length);
62                ns.Close();
63                Environment.Exit(0);
64            }

65        }

66C#實現確保單程式類        /// 
67        /// 結束確保單程式
68        /// 

69        public void Stop()
70C#實現確保單程式類        {
71            listener.Stop();
72        }

73
74        private void Run()
75C#實現確保單程式類        {
76            try
77C#實現確保單程式類            {
78                while (true)
79C#實現確保單程式類                {
80                    TcpClient client = listener.AcceptTcpClient();
81                    NetworkStream ns = client.GetStream();
82                    StreamReader sr = new StreamReader(ns);
83                    string s = sr.ReadToEnd();
84                    ns.Close();
85                    if (s.Equals(GuidString))
86C#實現確保單程式類                    {
87                        //觸發事件
88                        SecondProcessStart.Invoke(nullnull);
89                    }

90                }

91            }

92C#實現確保單程式類            catch { }
93        }

94    }

95}

==================================================================

下面是使用示例,僅需要修改Program.cs檔案(Demo專案Program.cs檔案如下):

==================================================================


 1using System;
 2using System.Collections.Generic;
 3using System.Windows.Forms;
 4
 5namespace 單例項執行
 6C#實現確保單程式類{
 7    static class Program
 8C#實現確保單程式類    {
 9        const int TcpPort = 53256;
10        const string GuidString = "C0DA3908-7F39-45ad-8E5B-CC47064031EA";
11        public static aaaSoft.SingleProcess sp;
12
13        public static Form frmMain;
14C#實現確保單程式類        /// 
15        /// 應用程式的主入口點。
16        /// 

17        [STAThread]
18        static void Main()
19C#實現確保單程式類        {
20            Application.EnableVisualStyles();
21            Application.SetCompatibleTextRenderingDefault(false);
22            frmMain = new Form1();
23
24            sp = new aaaSoft.SingleProcess(GuidString, TcpPort);
25            sp.SecondProcessStart += new EventHandler(sp_SecondProcessStart);
26            sp.Start();
27            Application.Run(frmMain);
28            sp.Stop();
29        }

30
31        static void sp_SecondProcessStart(object sender, EventArgs e)
32C#實現確保單程式類        {
33            frmMain.WindowState = FormWindowState.Normal;
34            frmMain.Show();
35            frmMain.Activate();
36        }

37    }

38}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-610735/,如需轉載,請註明出處,否則將追究法律責任。

相關文章