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