Пример #1
0
            /// <summary>
            /// Create a server instance from this configuration
            /// </summary>
            public KRPC.Server.Server Create()
            {
                KRPC.Server.Message.RPCServer    rpcServer    = null;
                KRPC.Server.Message.StreamServer streamServer = null;

                var serverProtocol = Protocol;

                if (serverProtocol == Protocol.ProtocolBuffersOverTCP ||
                    serverProtocol == Protocol.ProtocolBuffersOverWebsockets)
                {
                    var serverAddress = IPAddress.Loopback;
                    IPAddress.TryParse(Settings.GetValueOrDefault("address", IPAddress.Loopback.ToString()), out serverAddress);
                    ushort rpcPort    = 0;
                    ushort streamPort = 0;
                    ushort.TryParse(Settings.GetValueOrDefault("rpc_port", "0"), out rpcPort);
                    ushort.TryParse(Settings.GetValueOrDefault("stream_port", "0"), out streamPort);
                    var rpcTcpServer    = new TCPServer(serverAddress, rpcPort);
                    var streamTcpServer = new TCPServer(serverAddress, streamPort);
                    if (serverProtocol == Protocol.ProtocolBuffersOverTCP)
                    {
                        rpcServer    = new KRPC.Server.ProtocolBuffers.RPCServer(rpcTcpServer);
                        streamServer = new KRPC.Server.ProtocolBuffers.StreamServer(streamTcpServer);
                    }
                    else
                    {
                        rpcServer    = new KRPC.Server.WebSockets.RPCServer(rpcTcpServer);
                        streamServer = new KRPC.Server.WebSockets.StreamServer(streamTcpServer);
                    }
                }
                return(new KRPC.Server.Server(Id, serverProtocol, Name, rpcServer, streamServer));
            }
Пример #2
0
        static string CheckInvalidConnectionRequest(byte[] request)
        {
            var responseStream = new MemoryStream();
            var stream         = new TestStream(new MemoryStream(request), responseStream);

            // Create mock byte server and client
            var mockByteServer = new Mock <IServer <byte, byte> > ();
            var byteServer     = mockByteServer.Object;
            var byteClient     = new TestClient(stream);

            var server = new KRPC.Server.WebSockets.RPCServer(byteServer);

            server.OnClientRequestingConnection += (sender, e) => e.Request.Allow();
            server.Start();

            // Fire a client connection event
            var eventArgs = new ClientRequestingConnectionEventArgs <byte, byte> (byteClient);

            mockByteServer.Raise(m => m.OnClientRequestingConnection += null, eventArgs);

            Assert.IsFalse(eventArgs.Request.ShouldAllow);
            Assert.IsTrue(eventArgs.Request.ShouldDeny);

            server.Update();
            Assert.AreEqual(0, server.Clients.Count());

            return(Encoding.ASCII.GetString(responseStream.ToArray()));
        }
Пример #3
0
            /// <summary>
            /// Create a server instance from this configuration
            /// </summary>
            public KRPC.Server.Server Create()
            {
                KRPC.Server.Message.RPCServer    rpcServer    = null;
                KRPC.Server.Message.StreamServer streamServer = null;

                var serverProtocol = Protocol;

                if (serverProtocol == Protocol.ProtocolBuffersOverTCP ||
                    serverProtocol == Protocol.ProtocolBuffersOverWebsockets)
                {
                    var serverAddress = IPAddress.Loopback;
                    IPAddress.TryParse(Settings.GetValueOrDefault("address", IPAddress.Loopback.ToString()), out serverAddress);
                    ushort rpcPort    = 0;
                    ushort streamPort = 0;
                    ushort.TryParse(Settings.GetValueOrDefault("rpc_port", "0"), out rpcPort);
                    ushort.TryParse(Settings.GetValueOrDefault("stream_port", "0"), out streamPort);
                    var rpcTcpServer    = new TCPServer(serverAddress, rpcPort);
                    var streamTcpServer = new TCPServer(serverAddress, streamPort);
                    if (serverProtocol == Protocol.ProtocolBuffersOverTCP)
                    {
                        rpcServer    = new KRPC.Server.ProtocolBuffers.RPCServer(rpcTcpServer);
                        streamServer = new KRPC.Server.ProtocolBuffers.StreamServer(streamTcpServer);
                    }
                    else
                    {
                        rpcServer    = new KRPC.Server.WebSockets.RPCServer(rpcTcpServer);
                        streamServer = new KRPC.Server.WebSockets.StreamServer(streamTcpServer);
                    }
                }
                else
                {
                    uint   baudRate = 0;
                    ushort dataBits = 0;
                    KRPC.IO.Ports.Parity   parity;
                    KRPC.IO.Ports.StopBits stopBits;
                    uint.TryParse(Settings.GetValueOrDefault("baud_rate", "9600"), out baudRate);
                    ushort.TryParse(Settings.GetValueOrDefault("data_bits", "8"), out dataBits);
                    // TODO: add helper method for Enum.TryParse (only available in .NET 4)
                    try {
                        parity = (KRPC.IO.Ports.Parity)Enum.Parse(
                            typeof(KRPC.IO.Ports.Parity),
                            Settings.GetValueOrDefault("parity", "None"));
                    } catch (ArgumentException) {
                        parity = KRPC.IO.Ports.Parity.None;
                    }
                    try {
                        stopBits = (KRPC.IO.Ports.StopBits)Enum.Parse(
                            typeof(KRPC.IO.Ports.StopBits),
                            Settings.GetValueOrDefault("stop_bits", "One"));
                    } catch (ArgumentException) {
                        stopBits = KRPC.IO.Ports.StopBits.None;
                    }
                    var serialServer = new KRPC.Server.SerialIO.ByteServer(
                        Settings.GetValueOrDefault("port", string.Empty),
                        baudRate, dataBits, parity, stopBits);
                    rpcServer    = new KRPC.Server.SerialIO.RPCServer(serialServer);
                    streamServer = new KRPC.Server.SerialIO.StreamServer();
                }
                return(new KRPC.Server.Server(Id, serverProtocol, Name, rpcServer, streamServer));
            }
Пример #4
0
        static void CheckValidConnectionRequest(string request, string name)
        {
            var ascii        = Encoding.ASCII;
            var requestBytes = ascii.GetBytes(request);

            var responseStream = new MemoryStream();
            var stream         = new TestStream(new MemoryStream(requestBytes), responseStream);

            // Create mock byte server and client
            var mockByteServer = new Mock <IServer <byte, byte> >();
            var byteServer     = mockByteServer.Object;
            var byteClient     = new TestClient(stream);

            var server = new KRPC.Server.WebSockets.RPCServer(byteServer);

            server.OnClientRequestingConnection += (sender, e) => e.Request.Allow();
            server.Start();

            // Fire a client connection event
            var eventArgs = new ClientRequestingConnectionEventArgs <byte, byte>(byteClient);

            mockByteServer.Raise(m => m.OnClientRequestingConnection += null, eventArgs);

            Assert.IsTrue(eventArgs.Request.ShouldAllow);
            Assert.IsFalse(eventArgs.Request.ShouldDeny);

            server.Update();
            Assert.AreEqual(1, server.Clients.Count());
            Assert.AreEqual(name, server.Clients.First().Name);

            var response = ascii.GetString(responseStream.ToArray());

            Assert.AreEqual(
                "HTTP/1.1 101 Switching Protocols\r\n" +
                "Upgrade: websocket\r\n" +
                "Connection: Upgrade\r\n" +
                "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n",
                response
                );
        }
Пример #5
0
        public static void Main(string[] args)
        {
            bool showHelp    = false;
            bool showVersion = false;

            Logger.Format  = "{0:G} - {1} - {2}";
            Logger.Enabled = true;
            Logger.Level   = Logger.Severity.Info;
            bool   serverDebug = false;
            string bind        = "127.0.0.1";
            ushort rpcPort     = 0;
            ushort streamPort  = 0;
            string type        = "protobuf";

            var options = new OptionSet {
                {
                    "h|help", "show this help message and exit",
                    v => showHelp = v != null
                }, {
                    "v|version", "show program's version number and exit",
                    v => showVersion = v != null
                }, {
                    "bind=", "Address to bind the server to. If unspecified, the loopback address is used (127.0.0.1).",
                    v => bind = v
                }, {
                    "rpc-port=", "Port number to use for the RPC server. If unspecified, use an ephemeral port.",
                    (ushort v) => rpcPort = v
                }, {
                    "stream-port=", "Port number to use for the stream server. If unspecified, use an ephemeral port.",
                    (ushort v) => streamPort = v
                }, {
                    "type=", "Type of server to run. Either protobuf, websockets or websockets-echo.",
                    v => type = v
                }, {
                    "debug", "Set log level to 'debug', defaults to 'info'",
                    v => {
                        if (v != null)
                        {
                            Logger.Enabled = true;
                            Logger.Level   = Logger.Severity.Debug;
                        }
                    }
                }, { "quiet", "Set log level to 'warning'",
                     v => {
                         if (v != null)
                         {
                             Logger.Enabled = true;
                             Logger.Level   = Logger.Severity.Warning;
                         }
                     } }, {
                    "server-debug", "Output debug information about the server",
                    v => serverDebug = v != null
                }
            };

            options.Parse(args);

            if (showHelp)
            {
                Help(options);
                return;
            }

            if (showVersion)
            {
                var assembly = Assembly.GetEntryAssembly();
                var info     = FileVersionInfo.GetVersionInfo(assembly.Location);
                var version  = string.Format("{0}.{1}.{2}", info.FileMajorPart, info.FileMinorPart, info.FileBuildPart);
                Console.WriteLine("TestServer.exe version " + version);
                return;
            }

            KRPC.Service.Scanner.Scanner.GetServices();

            var core = Core.Instance;

            CallContext.SetGameScene(GameScene.SpaceCenter);
            core.OnClientRequestingConnection += (s, e) => e.Request.Allow();

            IPAddress bindAddress;

            if (!IPAddress.TryParse(bind, out bindAddress))
            {
                Console.WriteLine("Failed to parse bind address.");
                return;
            }

            var rpcTcpServer    = new TCPServer(bindAddress, rpcPort);
            var streamTcpServer = new TCPServer(bindAddress, streamPort);

            Server server;

            if (type == "protobuf")
            {
                var rpcServer    = new KRPC.Server.ProtocolBuffers.RPCServer(rpcTcpServer);
                var streamServer = new KRPC.Server.ProtocolBuffers.StreamServer(streamTcpServer);
                server = new Server(Guid.NewGuid(), Protocol.ProtocolBuffersOverTCP, "TestServer", rpcServer, streamServer);
            }
            else if (type == "websockets")
            {
                var rpcServer    = new KRPC.Server.WebSockets.RPCServer(rpcTcpServer);
                var streamServer = new KRPC.Server.WebSockets.StreamServer(streamTcpServer);
                server = new Server(Guid.NewGuid(), Protocol.ProtocolBuffersOverWebsockets, "TestServer", rpcServer, streamServer);
            }
            else if (type == "websockets-echo")
            {
                var rpcServer    = new KRPC.Server.WebSockets.RPCServer(rpcTcpServer, true);
                var streamServer = new KRPC.Server.WebSockets.StreamServer(streamTcpServer);
                server = new Server(Guid.NewGuid(), Protocol.ProtocolBuffersOverWebsockets, "TestServer", rpcServer, streamServer);
            }
            else
            {
                Logger.WriteLine("Server type '" + type + "' not supported", Logger.Severity.Error);
                return;
            }
            core.Add(server);

            Logger.WriteLine("Starting server...");
            core.StartAll();
            Logger.WriteLine("type = " + type);
            Logger.WriteLine("bind = " + bindAddress);
            Logger.WriteLine("rpc_port = " + rpcTcpServer.ActualPort);
            Logger.WriteLine("stream_port = " + streamTcpServer.ActualPort);
            Logger.WriteLine("Server started successfully");

            const long targetFPS      = 60;
            long       update         = 0;
            long       ticksPerUpdate = Stopwatch.Frequency / targetFPS;
            var        timer          = new Stopwatch();

            while (server.Running)
            {
                timer.Reset();
                timer.Start();

                core.Update();

                if (serverDebug && update % targetFPS == 0)
                {
                    // Output details about whether server.Update() took too little or too long to execute
                    var elapsed   = timer.ElapsedTicks;
                    var diffTicks = Math.Abs(ticksPerUpdate - elapsed);
                    var diffTime  = Math.Round(diffTicks / (double)Stopwatch.Frequency * 1000d, 2);
                    if (elapsed > ticksPerUpdate)
                    {
                        Console.WriteLine("Slow by " + diffTime + " ms (" + diffTicks + " ticks)");
                    }
                    else
                    {
                        Console.WriteLine("Fast by " + diffTime + " ms (" + diffTicks + " ticks)");
                    }
                }

                // Wait, to force 60 FPS
                while (timer.ElapsedTicks < ticksPerUpdate)
                {
                }
                update++;
            }
        }