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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程宝库

扩展:由于server端是存储了所有server与client的连接对象,因此我们是可以基于此demo的基础上实现聊天系统:* 每当一个与用户发言时,是由server接收到的 ...