public static ISuperSocketHostBuilder UseUdp <TUdpSessionIdentifierProvider>(this ISuperSocketHostBuilder hostBuilder)
     where TUdpSessionIdentifierProvider : class, IUdpSessionIdentifierProvider
 {
     return(hostBuilder.UseUdp().ConfigureServices((context, services) =>
     {
         services.AddSingleton <IUdpSessionIdentifierProvider, TUdpSessionIdentifierProvider>();
     }) as ISuperSocketHostBuilder);
 }
 public void Configure(ISuperSocketHostBuilder hostBuilder)
 {
     hostBuilder.UseUdp();
     hostBuilder.ConfigureServices((ctx, services) =>
     {
         services.Configure <ServerOptions>((options) =>
         {
             var listener = options.Listeners[0];
             Listener     = listener;
         });
     });
 }
Beispiel #3
0
        public ISuperSocketHostBuilder GetServerHostBuilder()
        {
            if (Builder != null)
            {
                return(Builder);
            }

            var jttTypes = new Dictionary <Type, Type>();

            var supersocketHostBuilder = SuperSocketHostBuilder.Create <TPackageInfo>();

            IHostBuilder hostBuilder = null;

            if (Options.ServerOptions != null)
            {
                supersocketHostBuilder.UsePackageHandler(
                    Options.ServerOptions.PackageHandler,
                    Options.ServerOptions.ErrorHandler);

                supersocketHostBuilder.UseSessionHandler(
                    Options.ServerOptions.OnConnected,
                    Options.ServerOptions.OnClosed);

                if (Options.ServerOptions.InProcSessionContainer)
                {
                    supersocketHostBuilder.UseInProcSessionContainer();
                }

                hostBuilder = supersocketHostBuilder.ConfigureServices((context, services) =>
                {
                    Options.ServerOptions.ConfigureServices?.Invoke(context, services);
                })
                              .ConfigureAppConfiguration((hostCtx, configApp) =>
                {
                    configApp.AddInMemoryCollection(new Dictionary <string, string>
                    {
                        { "serverOptions:name", Options.ServerOptions?.Name ?? $"SuperSocket {(Options.ServerOptions.UseUdp?"UDP":"TCP")} Server" },
                        { "serverOptions:listeners:0:ip", Options.ServerOptions?.IP },
                        { "serverOptions:listeners:0:port", Options.ServerOptions?.Port.ToString() },
                        { "serverOptions:listeners:0:backLog", Options.ServerOptions?.BackLog.ToString() }
                    });

                    Options.ServerOptions.ConfigureAppConfiguration?.Invoke(hostCtx, configApp);
                });
            }

            if (Options.LoggingOptions != null)
            {
                hostBuilder = (hostBuilder ?? supersocketHostBuilder).ConfigureLogging((hostCtx, loggingBuilder) =>
                {
                    if (Options.LoggingOptions?.Provider != null)
                    {
                        loggingBuilder.AddProvider(Options.LoggingOptions.Provider);
                    }
                    if (Options.LoggingOptions?.AddConsole == true)
                    {
                        loggingBuilder.AddConsole();
                    }
                    if (Options.LoggingOptions?.AddDebug != null)
                    {
                        loggingBuilder.AddDebug();
                    }
                });
            }

            Builder = (hostBuilder ?? supersocketHostBuilder) as ISuperSocketHostBuilder;

            if (Options.ServerOptions.UseUdp)
            {
                Builder.UseUdp();
            }

            return(Builder);
        }
Beispiel #4
0
 public static ISuperSocketHostBuilder <TReceivePackage> UseUdp <TReceivePackage>(this ISuperSocketHostBuilder <TReceivePackage> hostBuilder)
 {
     return(hostBuilder.UseUdp() as ISuperSocketHostBuilder <TReceivePackage>);
 }
        public ISuperSocketHostBuilder GetJTTServerHostBuilder()
        {
            if (Builder != null)
            {
                return(Builder);
            }

            //var dll = $"{AppDomain.CurrentDomain.BaseDirectory}/SuperSocket.{Options.ProtocolOptions.Version}.dll";
            //if (!File.Exists(dll))
            //    throw new JTTException($"未找到文件 {dll},请检查项目中是否添加了该NuGet包.");

            var assemblyName = Options.ProtocolOptions.Version == JTTVersion.JTTCustom
                ? Options.ProtocolOptions.JTTCustomAssemblyName
                : $"SuperSocket.JTT.{Options.ProtocolOptions.Version}";

            var assembly = Assembly.Load(assemblyName);

            if (assembly == null)
            {
                if (Options.ProtocolOptions.Version == JTTVersion.JTTCustom)
                {
                    throw new JTTException($"未找到命名空间 {assemblyName}.");
                }
                else
                {
                    throw new JTTException($"未找到命名空间 {assemblyName},请检查项目中是否添加了 SuperSocket.{Options.ProtocolOptions.Version} NuGet包.");
                }
            }

            var jttTypes = new Dictionary <Type, Type>();

            var types = assembly.GetTypes();

            foreach (var type in types)
            {
                if (JTTTypes.Protocol.IsAssignableFrom(type))
                {
                    jttTypes.Add(JTTTypes.Protocol, type);
                }
                //else if (JTTTypes.PipelineFilter.IsAssignableFrom(type))
                //    jttTypes.Add(JTTTypes.PipelineFilter, type);
                //else if (JTTTypes.PackageInfo.IsAssignableFrom(type))
                //    jttTypes.Add(JTTTypes.PackageInfo, type);
                //else if (JTTTypes.MessageHeader.IsAssignableFrom(type))
                //    jttTypes.Add(JTTTypes.MessageHeader, type);
                //else if (JTTTypes.Decoder.IsAssignableFrom(type))
                //    jttTypes.Add(JTTTypes.Decoder, type);
                //else if (JTTTypes.Encoder.IsAssignableFrom(type))
                //    jttTypes.Add(JTTTypes.Encoder, type);

                if (jttTypes.Count == 5)
                {
                    break;
                }
            }

            if (!jttTypes.ContainsKey(JTTTypes.Protocol))
            {
                throw new JTTException($"未找到继承了 {JTTTypes.Protocol.FullName}的类.");
            }
            //if (!jttTypes.ContainsKey(JTTTypes.PipelineFilter)) throw new JTTException($"未找到继承了 {JTTTypes.PipelineFilter.FullName}的类.");
            //if (!jttTypes.ContainsKey(JTTTypes.PackageInfo)) throw new JTTException($"未找到继承了 {JTTTypes.PackageInfo.FullName}的类.");
            //if (!jttTypes.ContainsKey(JTTTypes.MessageHeader)) throw new JTTException($"未找到继承了 {JTTTypes.MessageHeader.FullName}的类.");
            //if (!jttTypes.ContainsKey(JTTTypes.Decoder)) jttTypes[JTTTypes.Decoder] = typeof(JTTDecoder);//throw new JTTException($"未找到继承了 {JTTTypes.Decoder.FullName}的类.");
            //if (!jttTypes.ContainsKey(JTTTypes.Encoder)) throw new JTTException($"未找到继承了 {JTTTypes.Encoder.FullName}的类.");

            var protocol = typeof(JTTProtocolExtension).GetMethod(nameof(JTTProtocolExtension.GetProtocol), 1, new Type[] { typeof(string), typeof(JTTVersion) })
                           .MakeGenericMethod(jttTypes[typeof(IJTTProtocol)])
                           .Invoke(null, new object[] { Options.ProtocolOptions.ConfigFilePath, Options.ProtocolOptions.Version }) as IJTTProtocol;

            protocol.Initialization();

            if (protocol.Decoder == null)
            {
                throw new JTTException($"请在IJTTProtocol.Initialization方法中指定Decoder.");
            }

            if (protocol.Encoder == null)
            {
                throw new JTTException($"请在IJTTProtocol.Initialization方法中指定Encoder.");
            }

            if (Options.ProtocolOptions.Structures?.Any() == true)
            {
                protocol.Structures = Options.ProtocolOptions.Structures;
            }

            if (Options.ProtocolOptions.DataMappings?.Any() == true)
            {
                protocol.DataMappings = Options.ProtocolOptions.DataMappings;
            }

            if (Options.ProtocolOptions.InternalEntitysMappings?.Any() == true)
            {
                protocol.InternalEntitysMappings = Options.ProtocolOptions.InternalEntitysMappings;
            }

            //var handler = protocol.GetHandler();
            //var head = handler.GetFrameValue(protocol.HeadFrame);
            //var end = handler.GetFrameValue(protocol.EndFrame);

            //var pipelineFilter = jttTypes[JTTTypes.PipelineFilter].GetConstructor(new Type[] { typeof(byte[]), typeof(byte[]), JTTTypes.Decoder })
            //    .Invoke(new object[] { head, end, protocol.Decoder }) as IPipelineFilter<IJTTPackageInfo>;

            var supersocketHostBuilder = typeof(SuperSocketHostBuilder).GetMethod(nameof(SuperSocketHostBuilder.Create), 1, Type.EmptyTypes)
                                         .MakeGenericMethod(JTTTypes.PackageInfo)
                                         .Invoke(null, null) as ISuperSocketHostBuilder <IJTTPackageInfo>;

            supersocketHostBuilder.UsePipelineFilterFactory(o => Options.ProtocolOptions.PipelineFilterFactory?.Invoke(protocol, o) ?? protocol.GetFilter());

            IHostBuilder hostBuilder = null;

            if (Options.ServerOptions != null)
            {
                supersocketHostBuilder.UsePackageHandler(
                    Options.ServerOptions.PackageHandler,
                    Options.ServerOptions.ErrorHandler);

                typeof(ISuperSocketHostBuilder <IJTTPackageInfo>).GetMethod(nameof(ISuperSocketHostBuilder <IJTTPackageInfo> .UsePackageDecoder), 1, Type.EmptyTypes)
                .MakeGenericMethod(protocol.Decoder.GetType())
                .Invoke(supersocketHostBuilder, null);

                supersocketHostBuilder.UseSessionHandler(
                    Options.ServerOptions.OnConnected,
                    Options.ServerOptions.OnClosed);

                if (Options.ServerOptions.InProcSessionContainer)
                {
                    supersocketHostBuilder.UseInProcSessionContainer();
                }

                hostBuilder = supersocketHostBuilder.ConfigureServices((context, services) =>
                {
                    services.AddSingleton(protocol);
                    Options.ServerOptions.ConfigureServices?.Invoke(context, services, protocol);
                })
                              .ConfigureAppConfiguration((hostCtx, configApp) =>
                {
                    configApp.AddInMemoryCollection(new Dictionary <string, string>
                    {
                        { "serverOptions:name", Options.ServerOptions?.Name ?? $"{Options.ProtocolOptions.Version} Server" },
                        { "serverOptions:listeners:0:ip", Options.ServerOptions?.IP },
                        { "serverOptions:listeners:0:port", Options.ServerOptions?.Port.ToString() },
                        { "serverOptions:listeners:0:backLog", Options.ServerOptions?.BackLog.ToString() }
                    });

                    Options.ServerOptions.ConfigureAppConfiguration?.Invoke(hostCtx, configApp, protocol);
                });
            }

            if (Options.LoggingOptions != null)
            {
                hostBuilder = (hostBuilder ?? supersocketHostBuilder).ConfigureLogging((hostCtx, loggingBuilder) =>
                {
                    if (Options.LoggingOptions?.Provider != null)
                    {
                        loggingBuilder.AddProvider(Options.LoggingOptions.Provider);
                    }
                    if (Options.LoggingOptions?.AddConsole == true)
                    {
                        loggingBuilder.AddConsole();
                    }
                    if (Options.LoggingOptions?.AddDebug != null)
                    {
                        loggingBuilder.AddDebug();
                    }
                });
            }

            Builder = (hostBuilder ?? supersocketHostBuilder) as ISuperSocketHostBuilder;

            if (Options.ServerOptions.UseUdp)
            {
                Builder.UseUdp();
            }

            return(Builder);
        }