INetNode CreateNetNode(StatefulServiceContext initParams) { var logger = new LoggerConfiguration() .ConfigureMOUSETypesDestructure() .MinimumLevel.Verbose() .WriteTo.Seq("http://localhost:5341/") .CreateLogger(); var coreEventsLogger = new SerilogCoreEvents(logger); var lidgrenEventsLogger = new SerilogLidgrenEvents(logger); var messageSerializer = new ProtobufMessageSerializer(typeof(Message).Assembly, typeof(Say).Assembly); var endPoint = initParams .CodePackageActivationContext .GetEndpoint("ServiceEndPoint"); var nodeContext = FabricRuntime.GetNodeContext(); string nodeName = $"{nodeContext.NodeName}:{nodeContext.NodeId}"; var transport = new LidgrenNetProvider( new NetPeerConfiguration("Public") { MaximumConnections = 10, AcceptIncomingConnections = true, Port = endPoint.Port, LocalAddress = Dns.GetHostAddresses(nodeContext.IPAddressOrFQDN).First(x => x.AddressFamily == AddressFamily.InterNetwork) }, lidgrenEventsLogger); var netConfig = new NetNodeConfig() { ConnectTimeoutSec = 30, SendTimeoutSec = 30 }; var bufferPool = new WcfBufferPool(); var node = new NetNode<NetChannel>(nodeName, transport, coreEventsLogger, messageSerializer, config: netConfig, channelFactory: (owner, transportChannel) => new AsyncProcessingNetChannel(builder => builder .UseFiber(Fiber, config => config .Lock<Say>(LockType.Read) .Lock<JoinRoom>(LockType.Write) .Lock<PeerDisconnected>(LockType.Write)) .UseConfigurableDispatcher(config => config .HandleMessageAsync<Say>(OnSay) .HandleMessageAsync<JoinRoom>(OnRoomJoin) .HandleMessageAsync<PeerDisconnected>((msg, o) => OnRoomLeave(o.ReplyChannel))), owner, transportChannel, messageSerializer, coreEventsLogger, netConfig, bufferPool)); return node; }
static void Main(string[] args) { int port = 12345; var messageSerializer = new ProtobufMessageSerializer( new Message[] { new JoinRoom(), new Say(), new RoomEvent(), new JoinRoomResponse() }, new MessageHeader[] { new OperationHeader() }); var logger = new LoggerConfiguration() .ConfigureMOUSETypesDestructure() .MinimumLevel.Verbose() .WriteTo.ColoredConsole() .CreateLogger(); var coreEventLogger = new SerilogCoreEvents(logger); var transport = new LidgrenNetProvider( new NetPeerConfiguration("Public") { MaximumConnections = 10, AcceptIncomingConnections = true, Port = port, LocalAddress = IPAddress.Loopback }, new SerilogLidgrenEvents(logger)); var netConfig = new NetNodeConfig() { ConnectTimeoutSec = 30, SendTimeoutSec = 30 }; var bufferPool = new WcfBufferPool(); var node = new NetNode<NetChannel>("server", transport, coreEventLogger, messageSerializer, config: netConfig, channelFactory: (n, transportChannel) => new AsyncProcessingNetChannel(builder => builder .UseFiber(Fiber, config => config .Lock<Say>(LockType.Read) .Lock<JoinRoom>(LockType.Write) .Lock<PeerDisconnected>(LockType.Write)) .UseConfigurableDispatcher(config => config .HandleMessage<Say>(OnSay) .HandleMessage<JoinRoom>(OnRoomJoin) .HandleMessage<PeerDisconnected>((msg, o) => OnRoomLeave(o.ReplyChannel))), n, transportChannel, messageSerializer, coreEventLogger, netConfig, bufferPool)); node.Start(); Console.ReadKey(); }