必须填写至少10个字的日志
nnhy authored at 2012-07-27 18:48:21
8.50 KiB
X
//using System;
//using System.IO;
//using System.Net;
//using System.Threading;
//using NewLife.Messaging;
//using NewLife.Net.Sockets;
//using NewLife.PeerToPeer.Messages;
//using NewLife.Web;

//namespace NewLife.PeerToPeer.Server
//{
//    /// <summary>
//    /// 跟踪服务器
//    /// </summary>
//    public class TrackerServer : MessageServer
//    {
//        #region 属性
//        private Guid _Token;
//        /// <summary>标识</summary>
//        public Guid Token
//        {
//            get { return _Token; }
//            set { _Token = value; }
//        }
//        #endregion

//        #region 构造
//        /// <summary>
//        /// 根据标识实例化Tracker服务器
//        /// </summary>
//        /// <param name="token"></param>
//        public TrackerServer(Guid token)
//        {
//            Token = token;

//            MessageHandler.Error += new EventHandler<EventArgs<Message, Stream>>(MessageHandler_Error);
//            MessageHandler.Null += new EventHandler<EventArgs<Message, Stream>>(MessageHandler_Null);

//            //// 调用基类静态方法,为了触发基类的静态构造函数
//            //WriteLog("实例化跟踪服务器:" + token);
//        }

//        /// <summary>
//        /// 析构,取消事件注册
//        /// </summary>
//        ~TrackerServer()
//        {
//            MessageHandler.Error -= new EventHandler<EventArgs<Message, Stream>>(MessageHandler_Error);
//            MessageHandler.Null -= new EventHandler<EventArgs<Message, Stream>>(MessageHandler_Null);
//        }

//        private static Int32 _Inited = 0;
//        /// <summary>
//        /// 初始化
//        /// </summary>
//        public static void Init()
//        {
//            // 只执行一次,防止多线程冲突
//            if (Interlocked.CompareExchange(ref _Inited, 1, 0) != 0) return;

//        }

//        static void MessageHandler_Null(object sender, EventArgs<Message, Stream> e)
//        {
//            NullMessage message = e.Arg1 as NullMessage;
//            Stream stream = e.Arg2;

//            WriteLog("空数据!");

//            message.Serialize(stream);
//        }

//        static void MessageHandler_Error(object sender, EventArgs<Message, Stream> e)
//        {
//            ExceptionMessage message = e.Arg1 as ExceptionMessage;
//            Stream stream = e.Arg2;

//            WriteLog("出错!" + message.Error);
//        }
//        #endregion

//        #region 处理
//        /// <summary>
//        /// 已重载。
//        /// </summary>
//        /// <param name="sender"></param>
//        /// <param name="e"></param>
//        protected override void OnReceived(object sender, EventArgs<Message, Stream> e)
//        {
//            P2PMessage msg = e.Arg1 as P2PMessage;
//            if (msg == null) return;

//            switch (msg.MessageType)
//            {
//                case MessageTypes.Unkown:
//                    break;
//                case MessageTypes.Test:
//                    OnTest(e.Arg1 as TestMessage, e.Arg2);
//                    break;
//                case MessageTypes.Ping:
//                    OnPing(e.Arg1 as PingMessage, e.Arg2);
//                    break;
//                case MessageTypes.Track:
//                    OnTrack(e.Arg1 as TrackMessage, e.Arg2);
//                    break;
//                default:
//                    TestMessage.Response response = new TestMessage.Response();
//                    response.Str = "无法识别该消息!";
//                    response.WritePacket(e.Arg2);
//                    break;
//            }
//        }
//        #endregion

//        #region 测试
//        void OnTest(TestMessage msg, Stream stream)
//        {
//            WriteLog("收到{0}的测试消息:{1}", GetEndPoint(stream), msg.Str);

//            TestMessage.Response response = new TestMessage.Response();
//            response.Str = "消息收到!";

//            // 必须一次性写入到流中去,否则使用UDP时将会分多次发送
//            //response.Serialize(stream);
//            Byte[] buffer = response.ToArray();
//            stream.Write(buffer, 0, buffer.Length);
//        }
//        #endregion

//        #region 跟踪消息
//        void OnTrack(TrackMessage msg, Stream stream)
//        {
//            WriteLog("收到{0}的跟踪消息,种子:{1}", GetEndPoint(stream), msg.TorrentToken);

//            TestMessage.Response response = new TestMessage.Response();
//            response.Token = Token;
//            response.Str = "消息收到!";
//            response.WritePacket(stream);
//        }
//        #endregion

//        #region 活跃
//        void OnPing(PingMessage msg, Stream stream)
//        {
//            //WriteLog("{0} Ping Private={1}", remoteEP, msg.Private == null ? 0 : msg.Private.Count);

//            //AddFriend(msg, remoteEP);

//            //// 响应
//            //PingMessage.Response response = new PingMessage.Response();
//            //response.Public = remoteEP;
//            //response.Friends = GetFriends(msg);
//            //Send(tracker, response, remoteEP);
//        }
//        #endregion

//        #region 好友
//        //private Dictionary<Guid, Peer> _Friends;
//        ///// <summary>好友节点 TKey Public-Private</summary>
//        //public Dictionary<Guid, Peer> Friends
//        //{
//        //    get
//        //    {
//        //        if (_Friends == null) _Friends = new Dictionary<Guid, Peer>();
//        //        return _Friends;
//        //    }
//        //    set { _Friends = value; }
//        //}

//        //private DateTime _FriendUpdateTime;
//        ///// <summary>好友最后更新时间</summary>
//        //public DateTime FriendUpdateTime
//        //{
//        //    get { return _FriendUpdateTime; }
//        //    set { _FriendUpdateTime = value; }
//        //}

//        //void AddFriend(PingMessage msg, IPEndPoint publicEP)
//        //{
//        //    if (!Friends.ContainsKey(msg.Token))
//        //    {
//        //        lock (Friends)
//        //        {
//        //            if (!Friends.ContainsKey(msg.Token))
//        //            {
//        //                Peer peer = new Peer();
//        //                peer.Token = msg.Token;
//        //                peer.Private = msg.Private;
//        //                peer.Public = publicEP;
//        //                peer.InviteTime = DateTime.Now;

//        //                Friends.Add(msg.Token, peer);

//        //                FriendUpdateTime = DateTime.Now;

//        //                //WriteLog("添加好友:{0} {1}", publicEP, msg.Token);
//        //            }
//        //        }
//        //    }
//        //}

//        ///// <summary>
//        ///// 根据Ping消息取好友
//        ///// </summary>
//        ///// <param name="msg"></param>
//        ///// <returns></returns>
//        //List<Peer> GetFriends(PingMessage msg)
//        //{
//        //    if (!Friends.ContainsKey(msg.Token)) return null;

//        //    Peer peer = Friends[msg.Token];
//        //    //// 上次的活跃时间之后没有好友更新
//        //    //if (peer.ActiveTime > FriendUpdateTime) return null;

//        //    lock (Friends)
//        //    {
//        //        List<Peer> list = new List<Peer>(Friends.Values);
//        //        if (list.Contains(peer)) list.Remove(peer);
//        //        if (list == null || list.Count < 1) return null;

//        //        //WriteLog("取得好友:{0}", list.Count);
//        //        return list;
//        //    }
//        //}
//        #endregion

//        #region 辅助方法
//        static IPEndPoint GetEndPoint(Stream stream)
//        {
//            IPAddress address = IPAddress.Any;
//            if (stream is HttpStream)
//            {
//                //String ip = (stream as HttpStream).Context.Request.UserHostAddress;

//                //IPAddress.TryParse(ip, out address);

//                //return new IPEndPoint(address, 0);

//                return (stream as HttpStream).RemoteEndPoint;
//            }
//            else if (stream is SocketStream)
//            {
//                return (stream as SocketStream).RemoteEndPoint;
//            }

//            return new IPEndPoint(address, 0);
//        }
//        #endregion
//    }
//}