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

玩咖指针 2022-06-03 23:53:15