服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#使用Socket实现心跳的方法示例

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

2022-08-27 15:36风之_诉 C#

这篇文章主要介绍了C#使用Socket实现心跳的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Server端代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
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端代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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();
  }
}

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

原文链接:https://blog.csdn.net/luming666/article/details/79140990

延伸 · 阅读

精彩推荐
  • C#C#无损转换Image为Icon的方法

    C#无损转换Image为Icon的方法

    这篇文章主要为大家详细介绍了C#无损转换Image为Icon的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    AhDung5162021-12-30
  • C#C#多线程经典示例(吃苹果)

    C#多线程经典示例(吃苹果)

    本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解。下面跟着小编一起来看下吧...

    飞翔的月亮5112021-12-18
  • C#C# 拷贝数组的几种方法(总结)

    C# 拷贝数组的几种方法(总结)

    下面小编就为大家带来一篇C# 拷贝数组的几种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网9402021-12-03
  • C#C#计算2个字符串的相似度

    C#计算2个字符串的相似度

    这篇文章主要为大家详细介绍了C#计算2个字符串相似度的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    冰封一夏4932022-01-06
  • C#Unity 2017使用UGUI实现大转盘抽奖

    Unity 2017使用UGUI实现大转盘抽奖

    这篇文章主要为大家详细介绍了Unity 2017使用UGUI实现大转盘抽奖,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    伊卡-牛牛7832022-03-10
  • C#浅谈c#表达式树Expression简单类型比较demo

    浅谈c#表达式树Expression简单类型比较demo

    下面小编就为大家带来一篇浅谈c#表达式树Expression简单类型比较demo。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网11092021-12-24
  • C#C#读写指定编码格式的文本文件

    C#读写指定编码格式的文本文件

    这篇文章主要为大家详细介绍了C#读写指定编码格式文本文件的方法,感兴趣的小伙伴们可以参考一下...

    吴超10842021-11-15
  • C#C#向Word文档中添加内容控件的方法示例

    C#向Word文档中添加内容控件的方法示例

    这篇文章主要给大家介绍了C#向Word文档中添加内容控件的方法,文中对各种不同控件的添加方法分别进行了介绍,如组合框、文本、图片、日期选取器及下拉...

    Yesi7132021-12-18