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.");
                }
            }
        }

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM