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

    }
}
时间: 2024-10-09 05:46:36

Mina.Net实现的断线重连的相关文章

Mina 断线重连

定义:这里讨论的Mina 断线重连是指使用mina作为客户端软件,连接其他提供Socket通讯服务的服务器端.Socket服务器可以是Mina提供的服务器,也可以是C++提供的服务器. 一.断线重连的方式: 1. 在创建Mina客户端时增加一个监听器,或者增加一个拦截器,当检测到Session关闭时,自动进行重连. 2. 在第1种方式的基础上,增加客户端的读写通道空闲检查,当发生Session关闭或者读写空闲时,进行重连. 第一种方式比较传统,优点是简单方便,适合网络稳定.数据量不大(1M带宽以

socket 断线重连

send发送数据时,发送失败,进行如下重连处理: if(send(sockfd, serbuf, readlen, 0) < 0)//serbuf中有数据可以发送才会执行这条语句 { printf("serial to tcp send msg error: %s(errno: %d)\n", strerror(errno), errno);//服务端断掉,则发送失败. //exit(0); //断线重连 sleep(3); close(sockfd); sockfd = soc

关于socket tcp 断线重连

这个问题困扰过我几次,都没有来得及研究,今天研究一下. 首先写一个最简易的socket tcp程序,连接成功后再关闭服务器然后再用客户端各种操作看是什么情况 测试表明 (1)客户端已经连接,当服务端关闭程序时,客户端调用send函数发送失败,WSAGetLastError() 返回10054(远程主机强迫关闭了一个现有的连接) (2)客户端已经连接,当客户端关闭程序时,服务端调用recv函数接收失败,WSAGetLastError() 返回10054(远程主机强迫关闭了一个现有的连接) ,这时对

【c#源码】基于TCP通信的客户端断线重连

源码下载 在CS程序中,断线重连应该是一个常见的功能. 此处的断线重连主要指的是服务器端因为某种故障,服务器端程序或者系统进行了重新启动,客户端能够自动探测到服务器端掉线,并尝试重新进行连接 本程序基于来自英国的开源c#通信框架的networkcomms(2.3.1版本) 先看一下效果 初始状态: 当服务器端程序关闭后,客户端会自动探测到,并在客户端显示相关信息 然后,我们设定为每隔5秒重连一次,可以自定义设置重连的次数,比如说重连50次,如果还没有重连成功,则放弃重连 然后我们重新启动服务器端

房卡麻将分析系列之&quot;断线重连&quot;

"房卡"麻将研发技巧,尽在"红孩儿的游戏开发之路",欢迎关注公众号! 房卡麻将分析系列之"断线重连" 大家好,我是红孩儿,"房卡"麻将分析系列继续进行中. 在进行游戏的过程中,人们往往会遇到"断线"情况,比如坐公车,地铁下班路上玩一局,下车转站时往往先关机,过一会儿再上线继续完,如果没有自动"断线重连",则对于牌局的体验感影响会非常大,在"房卡"麻将中加入"

nodejs使用MYSQL连接池,断线重连

两种方式解决1.你可以配置mysql的连接池 var mysql = require('mysql'); var pool = mysql.createPool({ host: 'localhost', user: 'nodejs', password: 'nodejs', database: 'nodejs', port: 3306 }); var selectSQL = 'select * from t_user limit 10'; pool.getConnection(function

基于TCP通信的客户端断线重连

转载:http://www.cnblogs.com/networkcomms/p/4304362.html 源码下载 在CS程序中,断线重连应该是一个常见的功能. 此处的断线重连主要指的是服务器端因为某种故障,服务器端程序或者系统进行了重新启动,客户端能够自动探测到服务器端掉线,并尝试重新进行连接 本程序基于来自英国的开源c#通信框架的networkcomms(2.3.1版本) 先看一下效果 初始状态: 当服务器端程序关闭后,客户端会自动探测到,并在客户端显示相关信息 然后,我们设定为每隔5秒重

UniDAC 断线重连方法

KBM服务端的 UniConnection 要实现断线重连(连接 MSSQLServer), 需要以下几个步骤: 一.修改单元文件:kbmMWUniDAC.pas procedure TkbmMWUNIDACConnection.InternalOpenConnection(ConnectionPool:TkbmMWCustomConnectionPool); begin // Create new database connection using template. with TkbmMWU

通过任务计划程序实现上网卡断线重拨

由于工作中需要做一些服务器维护,为方便维护,在服务器上安装了一个4G无线上网卡.但是由于网络不稳定,经常在使用一两天后就断开,无法远程连接,甚是苦恼.在网上找了挺久也没有发现什么好的解决办法. 正好今天网络搜索发现了一个帖子<待机唤醒后自动连接宽带>,和我要解决的问题有异曲同工的感觉,于是便试了一试,果然好用,赶紧分享给大家. 1.首先新建文本文件,写入以下vbs代码,并保存为vbs文件: createobject("wscript.shell").run"ras