static void Main(string[] args) { Debug.DefaultDebugger = new ServerConsoleDebugger(); MessageProcessor.DefaultSerializer = new MsgPackBitSerializer(); /* * LoginReqMsg msg = new LoginReqMsg { * Account = "account", * Password = "******", * Extra = "去去去", * }; * * // var bytes = Serialize(msg); * var bytes = MessagePackSerializer.Serialize(msg); * var obj = MessagePackSerializer.Deserialize<LoginReqMsg>(bytes); * Console.WriteLine(MessagePackSerializer.ConvertToJson(bytes)); */ MessageProcessor messageProcessor = new MessageProcessor(); messageProcessor.Run(TaskScheduler.Default); MessageProcessor.RegisterHandler <LoginReqMsg>((msg, fromLink) => { var rsp = new LoginRspMsg { Player = new Model.Player { Status = Model.Status.Online, Name = "二逼青年" }, SeqNumber = msg.SeqNumber, }; var bytes = MessageProcessor.PackageMessage(rsp); fromLink.SendToRemoteAsync(bytes.buffer, 0, bytes.len); // Debug.LogFormat("{0}-{1}-{2}", msg.Account, msg.Password, msg.Extra); }); var udpServer = new UdpServer(messageProcessor); udpServer.Start(IPAddress.Any, 8063); do { var input = Console.ReadLine(); } while (true); /* * MessageProcessor.RegisterHandler<LoginReqMsg>((msg, remote) => { * Debug.LogFormat("LoginReqMsg - {0}|{1}|{2}", msg.Account, msg.Password, msg.Extra); * var loginReq = new LoginRspMsg { * Player = new Model.Player { * Name = "二逼青年", * Status = Model.Status.Online, * Mails = new System.Collections.Generic.Dictionary<int, Model.Mail> { * { * 234, * new Model.Mail { * Id = 234, * Title = "测试", * Content ="test" * } * } * }, * } * }; * var loginReqBytes = MessageProcessor.DefaultSerializer.Serialize( * MessageProcessor.PackageMessage(loginReq)); * udpServer.Send(loginReqBytes, remote); * }); */ }
private static IServer StartProtocol(Configuration c, ChatProtocolConfiguration pc, ServerContext ServerContext, TaskFactory Factory, TaskFactory PurifierFactory) { if (pc.OnTcp) { var s = pc.Tcp; if (!(s.SerializationProtocolType == SerializationProtocolType.Binary || s.SerializationProtocolType == SerializationProtocolType.Json)) { throw new InvalidOperationException("未知协议类型: " + s.SerializationProtocolType.ToString()); } Func <ISessionContext, IBinaryTransformer, KeyValuePair <IServerImplementation, IStreamedVirtualTransportServer> > VirtualTransportServerFactory; if (s.SerializationProtocolType == SerializationProtocolType.Binary) { VirtualTransportServerFactory = (Context, t) => { var p = ServerContext.CreateServerImplementationWithBinaryAdapter(Factory, Context); var si = p.Key; var a = p.Value; var bcps = new BinaryCountPacketServer(a, CommandName => true, t); return(new KeyValuePair <IServerImplementation, IStreamedVirtualTransportServer>(si, bcps)); }; } else if (s.SerializationProtocolType == SerializationProtocolType.Json) { VirtualTransportServerFactory = (Context, t) => { var p = ServerContext.CreateServerImplementationWithJsonAdapter(Factory, Context); var si = p.Key; var a = p.Value; var bcps = new JsonLinePacketServer(a, CommandName => true, t); return(new KeyValuePair <IServerImplementation, IStreamedVirtualTransportServer>(si, bcps)); }; } else { throw new InvalidOperationException(); } var Server = new TcpServer(ServerContext, VirtualTransportServerFactory, a => Factory.StartNew(a), a => PurifierFactory.StartNew(a)); var Success = false; try { Server.Bindings = s.Bindings.Select(b => new IPEndPoint(IPAddress.Parse(b.IpAddress), b.Port)).ToArray(); Server.SessionIdleTimeout = s.SessionIdleTimeout; Server.UnauthenticatedSessionIdleTimeout = s.UnauthenticatedSessionIdleTimeout; Server.MaxConnections = s.MaxConnections; Server.MaxConnectionsPerIP = s.MaxConnectionsPerIP; Server.MaxUnauthenticatedPerIP = s.MaxUnauthenticatedPerIP; Server.MaxBadCommands = s.MaxBadCommands; Server.Start(); Console.WriteLine(@"TCP/{0}服务器已启动。结点: {1}".Formats(s.SerializationProtocolType.ToString(), String.Join(", ", Server.Bindings.Select(b => b.ToString() + "(TCP)")))); Success = true; } finally { if (!Success) { Server.Dispose(); } } return(Server); } else if (pc.OnUdp) { var s = pc.Udp; if (!(s.SerializationProtocolType == SerializationProtocolType.Binary || s.SerializationProtocolType == SerializationProtocolType.Json)) { throw new InvalidOperationException("未知协议类型: " + s.SerializationProtocolType.ToString()); } Func <ISessionContext, IBinaryTransformer, KeyValuePair <IServerImplementation, IStreamedVirtualTransportServer> > VirtualTransportServerFactory; if (s.SerializationProtocolType == SerializationProtocolType.Binary) { VirtualTransportServerFactory = (Context, t) => { var p = ServerContext.CreateServerImplementationWithBinaryAdapter(Factory, Context); var si = p.Key; var a = p.Value; var bcps = new BinaryCountPacketServer(a, CommandName => true, t); return(new KeyValuePair <IServerImplementation, IStreamedVirtualTransportServer>(si, bcps)); }; } else if (s.SerializationProtocolType == SerializationProtocolType.Json) { VirtualTransportServerFactory = (Context, t) => { var p = ServerContext.CreateServerImplementationWithJsonAdapter(Factory, Context); var si = p.Key; var a = p.Value; var bcps = new JsonLinePacketServer(a, CommandName => true, t); return(new KeyValuePair <IServerImplementation, IStreamedVirtualTransportServer>(si, bcps)); }; } else { throw new InvalidOperationException(); } var Server = new UdpServer(ServerContext, VirtualTransportServerFactory, a => Factory.StartNew(a), a => PurifierFactory.StartNew(a)); var Success = false; try { Server.Bindings = s.Bindings.Select(b => new IPEndPoint(IPAddress.Parse(b.IpAddress), b.Port)).ToArray(); Server.SessionIdleTimeout = s.SessionIdleTimeout; Server.UnauthenticatedSessionIdleTimeout = s.UnauthenticatedSessionIdleTimeout; Server.MaxConnections = s.MaxConnections; Server.MaxConnectionsPerIP = s.MaxConnectionsPerIP; Server.MaxUnauthenticatedPerIP = s.MaxUnauthenticatedPerIP; Server.MaxBadCommands = s.MaxBadCommands; Server.TimeoutCheckPeriod = s.TimeoutCheckPeriod; Server.Start(); Console.WriteLine(@"UDP/{0}服务器已启动。结点: {1}".Formats(s.SerializationProtocolType.ToString(), String.Join(", ", Server.Bindings.Select(b => b.ToString() + "(UDP)")))); Success = true; } finally { if (!Success) { Server.Dispose(); } } return(Server); } else if (pc.OnHttp) { var s = pc.Http; Func <ISessionContext, KeyValuePair <IServerImplementation, IHttpVirtualTransportServer> > VirtualTransportServerFactory = Context => { var p = ServerContext.CreateServerImplementationWithJsonAdapter(Factory, Context); var si = p.Key; var a = p.Value; var jhps = new JsonHttpPacketServer(a, CommandName => true); return(new KeyValuePair <IServerImplementation, IHttpVirtualTransportServer>(si, jhps)); }; var Server = new HttpServer(ServerContext, VirtualTransportServerFactory, a => Factory.StartNew(a), a => PurifierFactory.StartNew(a)); var Success = false; try { Server.Bindings = s.Bindings.Select(b => b.Prefix).ToArray(); Server.SessionIdleTimeout = s.SessionIdleTimeout; Server.UnauthenticatedSessionIdleTimeout = s.UnauthenticatedSessionIdleTimeout; Server.MaxConnections = s.MaxConnections; Server.MaxConnectionsPerIP = s.MaxConnectionsPerIP; Server.MaxUnauthenticatedPerIP = s.MaxUnauthenticatedPerIP; Server.MaxBadCommands = s.MaxBadCommands; Server.TimeoutCheckPeriod = s.TimeoutCheckPeriod; Server.ServiceVirtualPath = s.ServiceVirtualPath; Server.Start(); Console.WriteLine(@"HTTP/{0}服务器已启动。结点: {1}".Formats("Json", String.Join(", ", Server.Bindings.Select(b => b.ToString())))); Success = true; } finally { if (!Success) { Server.Dispose(); } } return(Server); } else if (pc.OnHttpStatic) { var s = pc.HttpStatic; var Server = new StaticHttpServer(ServerContext, a => Factory.StartNew(a), 8 * 1024); var Success = false; try { Server.Bindings = s.Bindings.Select(b => b.Prefix).ToArray(); Server.SessionIdleTimeout = Math.Min(s.SessionIdleTimeout, s.UnauthenticatedSessionIdleTimeout); Server.MaxConnections = s.MaxConnections; Server.MaxConnectionsPerIP = s.MaxConnectionsPerIP; Server.MaxBadCommands = s.MaxBadCommands; Server.MaxUnauthenticatedPerIP = s.MaxUnauthenticatedPerIP; Server.ServiceVirtualPath = s.ServiceVirtualPath; Server.PhysicalPath = s.PhysicalPath; Server.Indices = s.Indices.Split(',').Select(Index => Index.Trim(' ')).Where(Index => Index != "").ToArray(); Server.Start(); Console.WriteLine(@"HTTP静态服务器已启动。结点: {0}".Formats(String.Join(", ", Server.Bindings.Select(b => b.ToString())))); Success = true; } finally { if (!Success) { Server.Dispose(); } } return(Server); } else { throw new InvalidOperationException("未知服务器类型: " + pc._Tag.ToString()); } }