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

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

(0)

相关推荐

  • c#(Socket)异步套接字代码示例

    异步客户端套接字示例 下面的示例程序创建一个连接到服务器的客户端.该客户端是用异步套接字生成的,因此在等待服务器返回响应时不挂起客户端应用程序的执行.该应用程序将字符串发送到服务器,然后在控制台显示该服务器返回的字符串. C# using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.Text; // State object for receiving data 

  • C#中Socket通信用法实例详解

    本文实例讲述了C#中Socket通信用法.分享给大家供大家参考.具体如下: 一.UDP方式: 服务器端代码: static void Main(string[] args) { int recv; byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//定义一网络端点 Socket newsock = new Socket(AddressFamily.InterNetwork, S

  • C#实现Socket通信的解决方法

    本文以实例详述了C#实现Socket通信的解决方法,具体实现步骤如下: 1.首先打开VS新建两个控制台应用程序: ConsoleApplication_socketServer和ConsoleApplication_socketClient.   2.在ConsoleApplication_socketClient中输入以下代码: using System; using System.Collections.Generic; using System.Linq; using System.Tex

  • C#之Socket操作类实例解析

    本文展示了一个C#的Socket操作类的完整实例,并附带了用法说明,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Collections; using System.Net; using System.Runtime.Serializ

  • 基于c#用Socket做一个局域网聊天工具

    程序设计成为简单的服务端和客户端之间的通信, 但通过一些方法可以将这两者进行统一起来, 让服务端也成为客户端, 让客户端也成为服务端, 使它们之间可以互相随时不间断的通信. 考虑到实现最原始的服务端和客户端之间的通信所需要的步骤对于写这样的程序是很有帮助的. 作为服务端, 要声明一个Socket A并绑定(Bind)某一个IP+这个IP指定的通信端口, 比如这个是127.0.0.1:9050, 然后开始监听(Listen), Listen可以监听来自多个IP传过来的连接请求, 具体可以同时连接几

  • C# Socket网络编程实例

    本文实例讲述了C# Socket网络编程技巧.分享给大家供大家参考.具体分析如下: 客户端要连接服务器:首先要知道服务器的IP地址.而服务器里有很多的应用程序,每一个应用程序对应一个端口号 所以客户端想要与服务器中的某个应用程序进行通信就必须要知道那个应用程序的所在服务器的IP地址,及应用程序所对应的端口号 TCP协议:安全稳定,一般不会发生数据丢失,但是效率低.利用TCP发生数据一般经过3次握手(所有效率低,自己百度三次握手) UDP协议:快速,效率高,但是不稳定,容易发生数据丢失(没有经过三

  • C# Socket的TCP通讯的实例代码

    Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接. (3)当完成通信后,服务器关闭与客户端的Socket连接. 客户端的步骤如下. (1)建立客户端的Socket,确定要连接的服务器的主机名和端口. (2)发送连接请求到服务器,并等待服务器的回馈信息. (3)连接成功后,与服务器进行数据的交互. (4)数据处

  • C#中异步Socket通信编程代码实例

    本文将在C#中Socket同步通信的基础上,分析和研究Socket异步编程的实现方法,目的是深入了解Socket编程的基本原理,增强对网络游戏开发相关内容的认识. 什么是Socket编程的异步是实现 所谓Socket编程的异步实现是指按照异步过程来实现Socket编程,那么什么是异步过程呢,我们把在完成了一次调用后通过状态.通知和回调来告知调用者的方式成为异步过程,换句话说,在异步过程中当调用一个方法时,调用者并不能够立刻得到结果,只有当这个方法调用完毕后调用者才能获得调用结果.这样做的好处是什

  • C#开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨

    1.TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议,也有许多的企业应用和互联网应用.http协议在应用层运行. 02,传输层(Tanspot):传输层包括UDP和TCP,UDP几乎不对报文进行检查,而TCP提供传输保证. 03,网络层(Netwok):网络层协议由一系列协议组成,包括ICMP.IGMP.RIP.OSPF.IP(v4,v6)等. 04,链路层(Link):又称为物

  • C#使用Socket实现发送和接收图片的方法

    本文实例讲述了C#使用Socket实现发送和接收图片的方法.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Net; using System.IO; namespace ConsoleApplication1 { Class Program { static void Main (String[]

  • C#实现的Socket服务器端、客户端代码分享

    服务端: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; namespace Server { class Program { static void Main(string[] args) { Socket server = new Socket(AddressFamily.InterNetwork, SocketType

  • c# socket网络编程接收发送数据示例代码

    代码分2块,server端: 复制代码 代码如下: class Program    {        static void Main(string[] args)        {            TcpListener lsner = new TcpListener(9000);            lsner.Start();            Console.WriteLine("started in port: 9000");            while

随机推荐