• Mina.Net实现的断线重连


    using Mina.Filter.Codec;
    using Mina.Filter.Codec.TextLine;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Text;
    using Mina.Core.Session;
    using System.Threading;
    
    namespace MinaDemo
    {
        class TCPMessageDemo
        {
            static string ip = "127.0.0.1";
            static int port = 1024;
            static void Main(string[] args)
            {
                Client();
            }
            static void Server()
            {
                var acceptor = new Mina.Transport.Socket.AsyncSocketAcceptor();
                acceptor.FilterChain.AddLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Encoding.UTF8)));
                acceptor.MessageReceived += (ss, ee) =>//接收到消息后
                {
                    Console.WriteLine("服务端收到" + ee.Session.RemoteEndPoint + "的消息:" + ee.Message + ",并广播:I love you all");
                    acceptor.Broadcast("I love you all");
                    //只有服务端接收到客户端发来消息时,才会把客户端存放到acceptor.ManagedSessions中,才能广播到。超过1分钟后,如果没有收到 Session,就会自动掉线的。
                };
                acceptor.SessionCreated += (ss, ee) => { ee.Session.Config.SetIdleTime(IdleStatus.BothIdle, 10); };
    
                acceptor.Bind(new IPEndPoint(IPAddress.Any, port));
                Console.WriteLine("linten in port " + port);
                Console.ReadLine();
                acceptor.Unbind();
                acceptor.Dispose();
            }
            static void Client()
            {
                var connector = new Mina.Transport.Socket.AsyncSocketConnector();
                connector.FilterChain.AddLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Encoding.UTF8)));
                connector.MessageReceived += (ss, ee) =>//接收到消息后
                {
                    Console.WriteLine("客户端收到" + ee.Session.RemoteEndPoint + "的消息:" + ee.Message + "");
                };
                connector.DefaultRemoteEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);
                var session = connector.Connect().Await().Session;
                connector.SessionClosed += (ss, ee) => { Console.WriteLine("SessionClosed"); };
                object lastSendFaileMessage = null;//记录最近一次发送的消息,如果发送失败的情况下,下次断线重连后还可以再发。
                connector.SessionDestroyed += (ss, ee) =>
                {
                    Console.WriteLine("SessionDestroyed");
                    //断绝重连
                    while (true)
                    {
                        try
                        {
                            if (!connector.Disposed)//如果不是因为客户端执行的关闭,则进行断线重连
                            {
                                Console.WriteLine("断线得连!");
                                session = connector.Connect().Await().Session;
                                Console.WriteLine("连接成功!");
                                if (!string.IsNullOrWhiteSpace(lastSendFaileMessage + "")) { session.Write(lastSendFaileMessage); }
                            }
                            else lastSendFaileMessage = null;
                            break;
                        }
                        catch (Exception ex) { Console.WriteLine("尝试失败:" + ex.Message); Thread.Sleep(1000); }
                    }
                };
                while (true)
                {
                    var line = Console.ReadLine();
                    if (line == "exit")
                    {
                        session.Close(true);
                        connector.Dispose();
                    }
                    if (session.Connected)
                    {
                        Console.WriteLine("Connected.");
                        if (session.Write(line).Exception != null)
                        {
                            lastSendFaileMessage = line;
                        }
                    }
                    else
                    {
                        Console.WriteLine("DisConnected.");
                    }
                }
            }
    
        }
    }
  • 相关阅读:
    代码互改
    第一次个人编程作业
    第一次博客
    个人总结
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    记录浏览他人代码
    中文编程作业
    第一篇随笔
  • 原文地址:https://www.cnblogs.com/songxingzhu/p/5445977.html
Copyright © 2020-2023  润新知