C#使用Socket实现心跳的方法示例

所属分类: 软件编程 / C#教程 阅读数: 71
收藏 0 赞 0 分享

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();
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

WPF仿三星手机充电界面实现代码

这篇文章主要为大家详细介绍了WPF仿三星手机充电界面实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

浅谈C#各种数组直接的数据复制/转换

下面小编就为大家带来一篇浅谈C#各种数组直接的数据复制/转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

C#访问SQLServer增删改查代码实例

这篇文章主要为大家详细介绍了C#访问SQLServer增删改查代码实例,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C#根据身份证号码判断出生日期和性别

这篇文章主要为大家详细介绍了C#根据身份证号码判断出生日期和性别的方法,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C# 向Word中设置/更改文本方向的方法(两种)

在一般情况下word中输入的文字都是横向的,今天小编给大家带来两种方法来设置更改文本方向的方法,非常不错,对c# word 更改文本方向的知识感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

让C# Excel导入导出 支持不同版本Office

让C# Excel导入导出,支持不同版本的Office,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C#设置自定义文件图标实现双击启动(修改注册表)

这篇文章介绍的是利用C#设置自定义文件图标,然后实现双击启动的功能,文章给出了示例代码,介绍的很详细,有需要的可以参考借鉴。
收藏 0 赞 0 分享

C#两个相同属性的类赋值方法

这篇文章主要介绍了C#两个相同属性的类赋值方法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

C#中ListView控件实现窗体代码

这篇文章主要介绍了C#中ListView控件实现窗体的核心代码,非常不错,具有参考借鉴价值,对c#listview相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

浅谈C# 序列化与反序列化几种格式的转换

下面小编就为大家带来一篇浅谈C# 序列化与反序列化几种格式的转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多