C#中怎么利用Socket实现心跳

发布时间:2021-07-26 14:08:31 作者:Leah
来源:亿速云 阅读:141

本篇文章给大家分享的是有关C#中怎么利用Socket实现心跳,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Server端代码:

class Program{  static SocketListener listener;   public static void Main(string[] args)  {    //实例化Timer类,设置间隔时间为5000毫秒;    System.Timers.Timer t = new System.Timers.Timer(5000);    t.Elapsed += new System.Timers.ElapsedEventHandler(CheckListen);    //到达时间的时候执行事件;     t.AutoReset = true;    t.Start();     listener = new SocketListener();    listener.ReceiveTextEvent += new SocketListener.ReceiveTextHandler(ShowText);    listener.StartListen();     Console.ReadKey();  }   private static void ShowText(string text)  {    Console.WriteLine(text);  }   private static void CheckListen(object sender, System.Timers.ElapsedEventArgs e)  {    if (listener != null && listener.Connection != null)    {      Console.WriteLine("连接数:" + listener.Connection.Count.ToString());    }  }} public class Connection{  Socket _connection;   public Connection(Socket socket)  {    _connection = socket;  }   public void WaitForSendData(object connection)  {    try    {      while (true)      {        byte[] bytes = new byte[1024];        string data = "";         //等待接收消息        int bytesRec = this._connection.Receive(bytes);         if (bytesRec == 0)        {          // ReceiveText("客户端[" + _connection.RemoteEndPoint.ToString() + "]连接关闭...");          break;        }         data += Encoding.UTF8.GetString(bytes, 0, bytesRec);        ReceiveText("收到消息:" + data);         string sendStr = "服务端已经收到信息!";        byte[] bs = Encoding.UTF8.GetBytes(sendStr);        _connection.Send(bs, bs.Length, 0);      }    }    catch (Exception)    {      ReceiveText("客户端[" + _connection.RemoteEndPoint.ToString() + "]连接已断开...");      Hashtable hConnection = connection as Hashtable;      if (hConnection.Contains(_connection.RemoteEndPoint.ToString()))      {        hConnection.Remove(_connection.RemoteEndPoint.ToString());      }    }  }   public delegate void ReceiveTextHandler(string text);  public event ReceiveTextHandler ReceiveTextEvent;  private void ReceiveText(string text)  {    if (ReceiveTextEvent != null)    {      ReceiveTextEvent(text);    }  }} public class SocketListener{  public Hashtable Connection = new Hashtable();   public void StartListen()  {  Agine:    try    {      //端口号、IP地址      //int port = 8889;      //string host = "127.0.0.1";      //IPAddress ip = IPAddress.Parse(host);      //IPEndPoint ipe = new IPEndPoint(ip, port);      string ip = string.Empty;      System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());      for (int i = 0; i != IpEntry.AddressList.Length; i++)      {        if (!IpEntry.AddressList[i].IsIPv6LinkLocal)        {          ip = IpEntry.AddressList[i].ToString();        }      }      IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 6000);      //创建一个Socket类      Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);      s.Bind(ipend);//绑定2000端口      s.Listen(0);//开始监听       ReceiveText("启动Socket监听...");       while (true)      {        Socket connectionSocket = s.Accept();//为新建连接创建新的Socket         ReceiveText("客户端[" + connectionSocket.RemoteEndPoint.ToString() + "]连接已建立...");         Connection gpsCn = new Connection(connectionSocket);        gpsCn.ReceiveTextEvent += new Connection.ReceiveTextHandler(ReceiveText);         Connection.Add(connectionSocket.RemoteEndPoint.ToString(), gpsCn);         //在新线程中启动新的socket连接,每个socket等待,并保持连接        Thread thread = new Thread(gpsCn.WaitForSendData);        thread.Name = connectionSocket.RemoteEndPoint.ToString();        thread.Start(Connection);      }    }    catch (ArgumentNullException ex1)    {      ReceiveText("ArgumentNullException:" + ex1);    }    catch (SocketException ex2)    {      ReceiveText("SocketException:" + ex2);    }     goto Agine;  }   public delegate void ReceiveTextHandler(string text);  public event ReceiveTextHandler ReceiveTextEvent;  private void ReceiveText(string text)  {    if (ReceiveTextEvent != null)    {      ReceiveTextEvent(text);    }  }}

Client端代码:

class Program{  static void Main(string[] args)  {    Socket c;     //int port = 4029;    // 避免使用127.0.0.1,我在本机测试是不能运行的    //string host = "127.0.0.1";    //IPAddress ip = IPAddress.Parse(host);    //IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例    string ip = string.Empty;    System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());    for (int i = 0; i != IpEntry.AddressList.Length; i++)    {      if (!IpEntry.AddressList[i].IsIPv6LinkLocal)      {        ip = IpEntry.AddressList[i].ToString();      }    }    IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 6000);     c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket     try    {      c.Connect(ipend);//连接到服务器       Console.WriteLine("连接到Socket服务端...");       Console.WriteLine("发送消息到服务端...");      string sendStr = "m s g";      byte[] bs = Encoding.UTF8.GetBytes(sendStr);      c.Send(bs, bs.Length, 0);       string recvStr = "";      byte[] recvBytes = new byte[1024];      int bytes;      bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息      recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);       Console.WriteLine("服务器返回信息:" + recvStr);    }    catch (ArgumentNullException ex1)    {      Console.WriteLine("ArgumentNullException:{0}", ex1);    }    catch (SocketException ex2)    {      Console.WriteLine("SocketException:{0}", ex2);    }     Console.ReadKey();  }}

以上就是C#中怎么利用Socket实现心跳,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

推荐阅读:
  1. C#使用Socket实现心跳的方法示例
  2. C# 实现Scoket心跳机制的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

socket

上一篇:Pytorch如何计算误判率,计算准确率,计算召回率

下一篇:css怎么设置div附带下拉条的样式

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》