.net 调度器怎么实现心跳(socket除了他,没选择吧)

自己写调度器,就要从tcp通信入手;心跳的实现除了使用socket,想不到其他任何方案。

socket基本使用demo:

  • Socket Client:
 1  static void Main(string[] args)
 2         {
 3             Socket c;
 4 
 5             //int port = 4029;
 6             // 避免使用127.0.0.1,我在本机测试是不能运行的
 7             //string host = "127.0.0.1";
 8             //IPAddress ip = IPAddress.Parse(host);
 9             //IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
10             string ip = string.Empty;
11             System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
12             for (int i = 0; i != IpEntry.AddressList.Length; i++)
13             {
14                 if (!IpEntry.AddressList[i].IsIPv6LinkLocal)
15                 {
16                     ip = IpEntry.AddressList[i].ToString();
17                 }
18             }
19             IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 8889);
20 
21             c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
22 
23             try
24             {
25                 c.Connect(ipend);//连接到服务器
26 
27                 Console.WriteLine("连接到Socket服务端...");
28 
29                 Console.WriteLine("发送消息到服务端...");
30                 string sendStr = "m s g";
31                 byte[] bs = Encoding.Default.GetBytes(sendStr);
32                 c.Send(bs, bs.Length, 0);
33 
34                 string recvStr = "";
35                 byte[] recvBytes = new byte[1024];
36                 int bytes;
37                 bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
38                 recvStr += Encoding.Default.GetString(recvBytes, 0, bytes);
39 
40                 Console.WriteLine("服务器返回信息:" + recvStr);
41             }
42             catch (ArgumentNullException ex1)
43             {
44                 Console.WriteLine("ArgumentNullException:{0}", ex1);
45             }
46             catch (SocketException ex2)
47             {
48                 Console.WriteLine("SocketException:{0}", ex2);
49             }
50             //string ip = string.Empty;
51             //System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
52             //for (int i = 0; i != IpEntry.AddressList.Length; i++)
53             //{
54             //    if (!IpEntry.AddressList[i].IsIPv6LinkLocal)
55             //    {
56             //        ip = IpEntry.AddressList[i].ToString();
57             //    }
58             //}
59             //IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 8889);
60             //Socket sc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
61             //sc.Connect(ipend);
62             //string message = "请升级软件";
63             //byte[] bt = Encoding.GetEncoding("gb2312").GetBytes(message);
64             //sc.Send(bt, bt.Length, 0);
65             //byte[] rebuff = new byte[1024];
66             //int recive = sc.Receive(rebuff, rebuff.Length, 0);
67             //string returnval = "";
68             //returnval += Encoding.GetEncoding("gb2312").GetString(rebuff, 0, recive); sc.Close();
69             //Console.WriteLine(returnval);
70 
71 
72             Console.ReadKey();
73         }

 

  • Socket Server:
  1  class Program
  2     {
  3         static SocketListener listener;
  4 
  5         public static void Main(string[] args)
  6         {
  7             System.Timers.Timer t = new System.Timers.Timer(2000);
  8             //实例化Timer类,设置间隔时间为5000毫秒;
  9             t.Elapsed += new System.Timers.ElapsedEventHandler(CheckListen);
 10             //到达时间的时候执行事件; 
 11             t.AutoReset = true;
 12             t.Start();
 13 
 14             listener = new SocketListener();
 15             listener.ReceiveTextEvent += new SocketListener.ReceiveTextHandler(ShowText);
 16             listener.StartListen();
 17 
 18             //    客户最近提出一个需求,要在WEB上远程管理客户端软件。那我们就仿路由器那种模式用SOCKET来解决吧。做了个DEMO,本机测试OK,拿到别的机器上做服务器,
 19             //提示由于目标机器积极拒绝,无法连接。查询各种资料,有的说是端口没开,有的说是服务没开。各种雾水啊!仔细一想,问题可能出在本机在局域网IP上,
 20             //而不是用127.0.0.1。更正代码后,问题解决。下面演示服务器端代码的关键部分。   
 21             //string ip = "";
 22             //System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
 23             //for (int i = 0; i != IpEntry.AddressList.Length; i++)
 24             //{
 25             //    if (!IpEntry.AddressList[i].IsIPv6LinkLocal)
 26             //    {
 27             //        ip = IpEntry.AddressList[i].ToString();
 28             //    }
 29             //}
 30 
 31             //IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 8889);
 32             //Socket sc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 33             //sc.Bind(ipend);
 34 
 35             //Socket acc;
 36 
 37             //while (true)
 38             //{
 39             //    sc.Listen(1);
 40             //    acc = sc.Accept();
 41             //    byte[] buff = new byte[1024];
 42             //    int recbyte = acc.Receive(buff, buff.Length, 0);
 43             //    if (recbyte == 0)
 44             //        break;
 45             //    string reciveval = "";
 46             //    reciveval += Encoding.Default.GetString(buff, 0, recbyte);
 47 
 48             //    Console.WriteLine(reciveval);
 49             //    string returnValue = "Accepted";
 50             //    byte[] returnBy = Encoding.Default.GetBytes(returnValue);
 51             //    acc.Send(returnBy, returnBy.Length, 0);
 52             //}
 53 
 54             //acc.Close();
 55             //sc.Close();
 56 
 57 
 58 
 59             Console.ReadKey();
 60         }
 61 
 62         private static void ShowText(string text)
 63         {
 64             Console.WriteLine(text);
 65         }
 66 
 67         private static void CheckListen(object sender, System.Timers.ElapsedEventArgs e)
 68         {
 69             if (listener != null && listener.Connection != null)
 70             {
 71                 Console.WriteLine("连接数:" + listener.Connection.Count.ToString());
 72             }
 73         }
 74     }
 75 
 76     public class Connection
 77     {
 78         Socket _connection;
 79 
 80         public Connection(Socket socket)
 81         {
 82             _connection = socket;
 83         }
 84 
 85         public void WaitForSendData()
 86         {
 87             try
 88             {
 89                 while (true)
 90                 {
 91                     byte[] bytes = new byte[1024];
 92                     string data = "";
 93 
 94                     //等待接收消息
 95                     int bytesRec = this._connection.Receive(bytes);
 96 
 97                     if (bytesRec == 0)
 98                     {
 99                         // ReceiveText("客户端[" + _connection.RemoteEndPoint.ToString() + "]连接关闭...");
100                         break;
101                     }
102 
103                     data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
104                     ReceiveText("收到消息:" + data);
105 
106                     string sendStr = "服务端已经收到信息!";
107                     byte[] bs = Encoding.UTF8.GetBytes(sendStr);
108                     _connection.Send(bs, bs.Length, 0);
109                 }
110             }
111             catch (Exception ex)
112             {
113                 Console.WriteLine(ex.Message);
114             }
115         }
116 
117         public delegate void ReceiveTextHandler(string text);
118         public event ReceiveTextHandler ReceiveTextEvent;
119         private void ReceiveText(string text)
120         {
121             if (ReceiveTextEvent != null)
122             {
123                 ReceiveTextEvent(text);
124             }
125         }
126     }
127 
128     public class SocketListener
129     {
130         public Hashtable Connection = new Hashtable();
131 
132         public void StartListen()
133         {
134         Agine:
135             try
136             {
137                 //端口号、IP地址
138                 //int port = 8889;
139                 //string host = "127.0.0.1";
140                 //IPAddress ip = IPAddress.Parse(host);
141                 //IPEndPoint ipe = new IPEndPoint(ip, port);
142                 string ip = string.Empty;
143                 System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
144                 for (int i = 0; i != IpEntry.AddressList.Length; i++)
145                 {
146                     if (!IpEntry.AddressList[i].IsIPv6LinkLocal)
147                     {
148                         ip = IpEntry.AddressList[i].ToString();
149                     }
150                 }
151                 IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 8889);
152                 //创建一个Socket类
153                 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
154                 s.Bind(ipend);//绑定2000端口
155                 s.Listen(0);//开始监听
156 
157                 ReceiveText("启动Socket监听...");
158 
159                 while (true)
160                 {
161                     Socket connectionSocket = s.Accept();//为新建连接创建新的Socket
162 
163                     ReceiveText("客户端[" + connectionSocket.RemoteEndPoint.ToString() + "]连接已建立...");
164 
165                     Connection gpsCn = new Connection(connectionSocket);
166                     gpsCn.ReceiveTextEvent += new Connection.ReceiveTextHandler(ReceiveText);
167 
168                     Connection.Add(connectionSocket.RemoteEndPoint.ToString(), gpsCn);
169 
170                     //在新线程中启动新的socket连接,每个socket等待,并保持连接
171                     Thread thread = new Thread(new ThreadStart(gpsCn.WaitForSendData));
172                     thread.Name = connectionSocket.RemoteEndPoint.ToString();
173                     thread.Start();
174                 }
175             }
176             catch (ArgumentNullException ex1)
177             {
178                 ReceiveText("ArgumentNullException:" + ex1);
179             }
180             catch (SocketException ex2)
181             {
182                 ReceiveText("SocketException:" + ex2);
183             }
184 
185             goto Agine;
186         }
187 
188         public delegate void ReceiveTextHandler(string text);
189         public event ReceiveTextHandler ReceiveTextEvent;
190         private void ReceiveText(string text)
191         {
192             if (ReceiveTextEvent != null)
193             {
194                 ReceiveTextEvent(text);
195             }
196         }
197     }

 代码实现参考:http://blog.bossma.cn/csharp/csharp_socket_example/

                     https://msdn.microsoft.com/zh-cn/library/System.Net.Sockets.Socket(v=vs.100).aspx

posted @ 2015-04-15 00:31  cctext  阅读(1105)  评论(0编辑  收藏  举报