コード例 #1
0
        public void GivenIHaveARunningServer(string serverConfig, string clusterConfig)
        {
            NameValueCollection parameters = new NameValueCollection {
                { "port", GetFreePort().ToString() }
            };

            DarkRiftServerConfigurationBuilder serverConfigurationBuilder = DarkRiftServerConfigurationBuilder.CreateFromXml("Configurations/Server/" + serverConfig, parameters);

#if PRO
            serverConfigurationBuilder.AddPluginType(typeof(InMemoryServerRegistryConnector));

            DarkRiftServer server = new DarkRiftServer(
                serverConfigurationBuilder.ServerSpawnData,
                ClusterSpawnData.CreateFromXml("Configurations/Cluster/" + clusterConfig, new NameValueCollection())
                );
#else
            DarkRiftServer server = new DarkRiftServer(
                serverConfigurationBuilder.ServerSpawnData
                );
#endif

            server.StartServer();

            world.AddServer(server);

#if DEBUG
            // We've just requested a load of objects that wont be returned until we close
            // UDP receive TCP accept
            performanceSteps.ExpectedUnaccountedForSocketAsyncEventArgs += 2;
#endif
        }
コード例 #2
0
        /// <summary>
        /// Start a server with our listener and a basic configuration.
        /// </summary>
        /// <returns>The created server.</returns>
        private DarkRiftServer StartServer()
        {
            ServerSpawnData serverSpawnData = new ServerSpawnData();

            // Add listener type
            serverSpawnData.PluginSearch.PluginTypes.Add(typeof(NetworkListener1));

            // Create listener config
            serverSpawnData.Listeners.NetworkListeners.Add(new ServerSpawnData.ListenersSettings.NetworkListenerSettings
            {
                Name    = "ListenerUnderTest",
                Type    = nameof(NetworkListener1),
                Address = IPAddress.Loopback,
                Port    = GetFreePort()
            });

            // Add a logger
            serverSpawnData.Logging.LogWriters.Add(new ServerSpawnData.LoggingSettings.LogWriterSettings {
                Name      = "ConsoleWriter",
                Type      = "ConsoleWriter",
                LogLevels = new LogType[] { LogType.Trace, LogType.Info, LogType.Warning, LogType.Error, LogType.Fatal }
            });
            serverSpawnData.Logging.LogWriters[0].Settings.Add("useFastAnsiColoring", "false");

            DarkRiftServer server = new DarkRiftServer(serverSpawnData);

            server.Start();
            return(server);
        }
コード例 #3
0
        /// <summary>
        ///     Creates the server.
        /// </summary>
        public void Create(NameValueCollection variables)
        {
            if (Server != null)
                throw new InvalidOperationException("The server has already been created! (Is CreateOnEnable enabled?)");
            
            if (configuration != null)
            {
                //Create spawn data from config
                ServerSpawnData spawnData = ServerSpawnData.CreateFromXml(XDocument.Parse(configuration.text), variables);

                //Inaccessible from xml, set from inspector
                spawnData.EventsFromDispatcher = eventsFromDispatcher;

                //Unity is broken, work around it...
                //This is an obsolete property but is still used if the user is using obsolete <server> tag properties
#pragma warning disable 0618
                spawnData.Server.UseFallbackNetworking = true;
#pragma warning restore 0618

                //Add types
                spawnData.PluginSearch.PluginTypes.AddRange(UnityServerHelper.SearchForPlugins());
                spawnData.PluginSearch.PluginTypes.Add(typeof(UnityConsoleWriter));

                //Create server
                Server = new DarkRiftServer(spawnData);
                Server.Start();
                enetListener = Server.NetworkListenerManager.GetNetworkListenersByType<EnetListenerPlugin>().First();
            }
            else
                Debug.LogError("No configuration file specified!");
        }
コード例 #4
0
 void Start()
 {
     xmlServer = GetComponent <XmlUnityServer>();
     server    = xmlServer.Server;
     server.ClientManager.ClientConnected    += OnClientConnected;
     server.ClientManager.ClientDisconnected += OnClientDisconnected;
 }
コード例 #5
0
        /// <summary>
        ///     Creates the server.
        /// </summary>
        public void Create(NameValueCollection variables)
        {
            if (Server != null)
            {
                throw new InvalidOperationException("The server has already been created! (Is CreateOnEnable enabled?)");
            }

            if (configuration != null)
            {
                //Create spawn data from config
                ServerSpawnData spawnData = ServerSpawnData.CreateFromXml(XDocument.Parse(configuration.text), variables);

                //Inaccessible from xml, set from inspector
                spawnData.EventsFromDispatcher = eventsFromDispatcher;

                //Unity is broken, work around it...
                spawnData.Server.UseFallbackNetworking = true;

                //Add types
                spawnData.PluginSearch.PluginTypes.AddRange(UnityServerHelper.SearchForPlugins());
                spawnData.PluginSearch.PluginTypes.Add(typeof(UnityConsoleWriter));

                //Create server
                Server = new DarkRiftServer(spawnData);
                Server.Start();
            }
            else
            {
                Debug.LogError("No configuration file specified!");
            }
        }
コード例 #6
0
        public Connector()
        {
            InstallSubdirectory(
                new Dictionary <string, byte[]>
            {
                { "settings.cnf", System.Text.Encoding.ASCII.GetBytes("ConnectionString:\t\tSERVER=localhost;DATABASE=DarkRift;USERNAME=username;PASSWORD=password") }
            }
                );

            try
            {
                ConfigReader reader = new ConfigReader(GetSubdirectory() + @"\settings.cnf");

                if (reader["ConnectionString"] == null)
                {
                    Interface.LogFatal("ConnectionString was not defined in the MySQLConnector's settings.cnf file!");
                    DarkRiftServer.Close(true);
                }
                connectionString = reader["ConnectionString"];
            }
            catch (System.IO.FileNotFoundException)
            {
                Interface.LogFatal("MySQLConnector's settings file is missing!");
                DarkRiftServer.Close(true);
            }
        }
コード例 #7
0
 void Awake()
 {
     //Start the server in embedded mode so with given parameters. The Debug functions pointers redirect Interface
     //messages to Unity, the this will tell the server not the use the thread pool to dispatch events but instead
     //let this script sort it out.
     DarkRiftServer.Bootstrap(Mode.Embedded, port, maxConnections, logData, Debug.Log, Debug.LogWarning, Debug.LogError, Debug.LogError, this, forceLoadPlugins);
 }
コード例 #8
0
 private void Shutdown()
 {
     if (this.server != null)
     {
         this.server.Dispose();
         this.server = null;
     }
 }
コード例 #9
0
 public void FindConnections(string [] parts)
 {
     ConnectionService[] allCons = DarkRiftServer.GetAllConnections();
     Interface.Log("Amount of connected connections are " + allCons.Length);
     for (int i = 0; i < allCons.Length; i++)
     {
         Interface.Log("The connection id is " + allCons[i].id);
     }
 }
コード例 #10
0
 public void ClearConnections(string [] parts)
 {
     ConnectionService[] allCons = DarkRiftServer.GetAllConnections();
     Interface.Log("Amount of connected connections are " + allCons.Length);
     for (int i = 0; i < allCons.Length; i++)
     {
         allCons[i].SendNetworkMessage(new NetworkMessage(0, DistributionType.Reply, 0, 255, 0, 0));
         allCons[i].Close();
     }
 }
コード例 #11
0
        void IServerTransportLayer.Start(int port)
        {
            if (this.server != null)
            {
                this.Shutdown();
            }

            this.server = new DarkRiftServer(new ServerSpawnData(IPAddress.Parse("127.0.0.1"), 9999, DarkRift.IPVersion.IPv4));
            this.server.Start();
        }
コード例 #12
0
        void OnDestroy()
        {
            DarkRiftServer server = Server.Server;

            if (server != null)
            {
                server.ClientManager.ClientConnected    -= OnClientConnect;
                server.ClientManager.ClientDisconnected -= OnClientDisconnect;
            }
        }
コード例 #13
0
    void OnApplicationQuit()
    {
        //Because Unity stops calling Update/FixedUpdate/LateUpdate before OnApplicationQuit the wait handles
        //required will cause DarkRift to wait forever and crash Unity, therefore if we're closing we just need
        //to execute stuff as it comes to us.
        closing = true;

        //Close the server when we close unity!
        DarkRiftServer.Close(false);
    }
コード例 #14
0
        /// <summary>
        /// Connect a client with our client connection to the given server.
        /// </summary>
        /// <returns>The created client.</returns>
        private DarkRiftClient ConnectClient(DarkRiftServer server)
        {
            NetworkClientConnection1 connection = new NetworkClientConnection1(IPAddress.Loopback, server.NetworkListenerManager.GetNetworkListenerByName("ListenerUnderTest").Port);

            DarkRiftClient client = new DarkRiftClient();

            client.Connect(connection);

            return(client);
        }
コード例 #15
0
 void Update()
 {
     //Broadcast all positions to all clients constantly
     foreach (ConnectionService cs in DarkRiftServer.GetAllConnections())
     {
         for (int i = 0; i < cubes.Length; i++)
         {
             cs.SendReply(0, (ushort)i, (Vector3Carrier)cubes[i].position);
         }
     }
 }
コード例 #16
0
    private void Awake()
    {
        if (Instance != null)
        {
            Destroy(gameObject);
            return;
        }
        Instance = this;
        XmlServer.Create();
        Server = XmlServer.Server;

        DontDestroyOnLoad(this);
    }
コード例 #17
0
        /// <summary>
        ///     Closes the server.
        /// </summary>
        public void Close()
        {
            if (Server != null)
            {
                Server.Dispose();
            }
            else
            {
                return;
            }

            Server = null;
        }
コード例 #18
0
        private void OnRoomCreated(object sender, RoomModel e)
        {
            if (e == null)
            {
                return;
            }

            foreach (var player in e.Players)
            {
                var connection = DarkRiftServer
                                 .GetConnectionServiceByID((ushort)player.PlayerID);
                //do stuff here -> connection.SendReply()
            }
        }
コード例 #19
0
        public void TestClientCanConnectToServer()
        {
            // GIVEN a running server
            DarkRiftServer server = StartServer();

            // WHEN I connect a client
            DarkRiftClient client = ConnectClient(server);

            // THEN the client is connected
            Assert.AreEqual(ConnectionState.Connected, client.ConnectionState);

            // AND the server contains one client
            Assert.AreEqual(1, server.ClientManager.Count);
        }
コード例 #20
0
        public void TestServerCanJoin()
        {
            // GIVEN a server running in group 1
            DarkRiftServer server1 = StartServer("Group1", true);

            // WHEN a second server starts
            DarkRiftServer server2 = StartServer("Group2", true);

            // THEN the first server discovers the second server
            WaitUntil("Timed out waiting for server 1 to discover server 2.", () => Assert.AreEqual(1, server1.RemoteServerManager.GetGroup("Group2").Count), TimeSpan.FromSeconds(30));

            // AND the second server discovers the first server
            WaitUntil("Timed out waiting for server 2 to discover server 1.", () => Assert.AreEqual(1, server2.RemoteServerManager.GetGroup("Group1").Count), TimeSpan.FromSeconds(30));
        }
コード例 #21
0
        /// <summary>
        ///     Creates the server.
        /// </summary>
        public void Create(NameValueCollection variables)
        {
            if (Server != null)
            {
                if (Server.Disposed)
                {
                    Server.StartServer();
                }
                else
                {
                    throw new InvalidOperationException("The server has already been created! (Is CreateOnEnable enabled?)");
                }
            }

            if (configuration != null)
            {
                // Create spawn data from config
                ServerSpawnData spawnData = ServerSpawnData.CreateFromXml(XDocument.Parse(configuration.text), variables);
                if (spawnData == null)
                {
                    throw new Exception("SpawnData not defined");
                }

                // Allow only this thread to execute dispatcher tasks to enable deadlock protection
                spawnData.DispatcherExecutorThreadID = Thread.CurrentThread.ManagedThreadId;

                // Inaccessible from XML, set from inspector
                spawnData.EventsFromDispatcher = eventsFromDispatcher;

                // Unity is broken, work around it...
                // This is an obsolete property but is still used if the user is using obsolete <server> tag properties
#pragma warning disable 0618
                spawnData.Server.UseFallbackNetworking = true;
#pragma warning restore 0618

                // Add types
                spawnData.PluginSearch.PluginTypes.AddRange(UnityServerHelper.SearchForPlugins());

                spawnData.Listeners.NetworkListeners[0].Port = port;

                // Create server
                Server = new DarkRiftServer(spawnData);
                Server.StartServer();
            }
            else
            {
                throw new Exception("Configuration file not set");
            }
        }
コード例 #22
0
    public void Init(DarkRiftServer server)
    {
        this.server = server;

        this.turrets = new ServerTurretController[turretSpawns.Length];
        for (var i = 0; i < turrets.Length; ++i)
        {
            turrets[i] = Instantiate(
                turretPrefab,
                turretSpawns[i].position,
                turretSpawns[i].rotation);
            turrets[i].Manager = this;
            turrets[i].Server  = this.server;
        }
    }
コード例 #23
0
        private void BroadcastToRoom(NetworkMessage data)
        {
            RoomModel room = null;

            if (RoomsManager.TryGetPlayerRoom(data.senderID, out room))
            {
                foreach (var player in room.Players)
                {
                    var connection = DarkRiftServer
                                     .GetConnectionServiceByID((ushort)player.PlayerID);

                    connection.SendReply((byte)data.subject, 0, data.data);
                }
            }
        }
コード例 #24
0
 public bool StartServer(int port, int maxConnections)
 {
     if (IsServerStarted)
     {
         return(false);
     }
     ServerMaxConnections = maxConnections;
     serverPeers.Clear();
     serverEventQueue.Clear();
     Server = new DarkRiftServer(new ServerSpawnData(IPAddress.Any, (ushort)port, IPVersion.IPv4));
     Server.ClientManager.ClientConnected    += Server_ClientManager_ClientConnected;
     Server.ClientManager.ClientDisconnected += Server_ClientManager_ClientDisconnected;
     Server.Start();
     return(true);
 }
コード例 #25
0
        public void Create()
        {
            if (Server != null)
            {
                throw new InvalidOperationException("The server has already been created! (Is CreateOnEnable enabled?)");
            }

            var spawnData = new ServerSpawnData(Address, Port, IpVersion);

            //Data settings
            spawnData.Data.Settings["directory"] = DataDirectory;

            //Logging settings
            spawnData.Plugins.PluginTypes.Add(typeof(UnityConsoleWriter));

            var fileWriter = new ServerSpawnData.LoggingSettings.LogWriterSettings
            {
                Name      = "FileWriter1",
                Type      = "FileWriter",
                LogLevels = new[] { LogType.Trace, LogType.Info, LogType.Warning, LogType.Error, LogType.Fatal }
            };

            fileWriter.Settings["file"] = LogFileString;

            var consoleWriter = new ServerSpawnData.LoggingSettings.LogWriterSettings
            {
                Name      = "UnityConsoleWriter1",
                Type      = "UnityConsoleWriter",
                LogLevels = new[] { LogType.Info, LogType.Warning, LogType.Error, LogType.Fatal }
            };

            var debugWriter = new ServerSpawnData.LoggingSettings.LogWriterSettings
            {
                Name      = "DebugWriter1",
                Type      = "DebugWriter",
                LogLevels = new[] { LogType.Warning, LogType.Error, LogType.Fatal }
            };

            spawnData.Logging.LogWriters.Add(fileWriter);
            spawnData.Logging.LogWriters.Add(consoleWriter);
            spawnData.Logging.LogWriters.Add(debugWriter);

            // Plugins
//            spawnData.Plugins.PluginTypes.Add(typeof(DbConnector));

            Server = new DarkRiftServer(spawnData);
            Server.Start();
        }
コード例 #26
0
        public void TestServerCanTimeout()
        {
            // GIVEN a server running in group 1 without a health check
            DarkRiftServer server1 = StartServer("Group1", false);

            // AND a server running in group 2
            DarkRiftServer server2 = StartServer("Group2", true);

            // AND the servers know of each other
            WaitUntil("Timed out waiting for server 1 to discover server 2.", () => Assert.AreEqual(1, server1.RemoteServerManager.GetGroup("Group2").Count), TimeSpan.FromSeconds(30));
            WaitUntil("Timed out waiting for server 2 to discover server 1.", () => Assert.AreEqual(1, server2.RemoteServerManager.GetGroup("Group1").Count), TimeSpan.FromSeconds(30));

            // WHEN waiting (a long time)
            // THEN the second server sees server 1 timeout
            WaitUntil("Timed out waiting for server 2 to see server 1 left.", () => Assert.AreEqual(1, server2.RemoteServerManager.GetGroup("Group1").Count), TimeSpan.FromMinutes(2));
        }
コード例 #27
0
        public void TestServerCanLeave()
        {
            // GIVEN a server running in group 1 and another in group 2
            DarkRiftServer server1 = StartServer("Group1", true);
            DarkRiftServer server2 = StartServer("Group2", true);

            // AND the servers know of each other
            WaitUntil("Timed out waiting for server 1 to discover server 2.", () => Assert.AreEqual(1, server1.RemoteServerManager.GetGroup("Group2").Count), TimeSpan.FromSeconds(30));
            WaitUntil("Timed out waiting for server 2 to discover server 1.", () => Assert.AreEqual(1, server2.RemoteServerManager.GetGroup("Group1").Count), TimeSpan.FromSeconds(30));

            // WHEN the first server closes
            server1.Dispose();

            // THEN the second server knows of the closure
            WaitUntil("Timed out waiting for server 2 to see server 1 left.", () => Assert.AreEqual(1, server2.RemoteServerManager.GetGroup("Group1").Count), TimeSpan.FromSeconds(30));
        }
コード例 #28
0
        public void GivenIHaveARunningServer(string serverConfig)
        {
            NameValueCollection parameters = new NameValueCollection {
                { "port", GetFreePort().ToString() }
            };

            DarkRiftServer server = new DarkRiftServer(ServerSpawnData.CreateFromXml("Configurations/Server/" + serverConfig, parameters));

            server.StartServer();

            world.AddServer(server);

#if DEBUG
            // We've just requested a load of objects that wont be returned until we close
            // UDP receive TCP accept
            performanceSteps.ExpectedUnaccountedForSocketAsyncEventArgs += 2;
#endif
        }
コード例 #29
0
ファイル: World.cs プロジェクト: DarkRiftNetworking/DarkRift
        /// <summary>
        ///     Adds a new server to the world.
        /// </summary>
        /// <param name="server">The serverto add.</param>
        public void AddServer(DarkRiftServer server)
        {
#if PRO
            servers.Add(server.RemoteServerManager.ServerID, server);

            server.ClientManager.ClientConnected += (s, a) => ClientConnected(s, a, server.RemoteServerManager.ServerID);

            foreach (IServerGroup group in server.RemoteServerManager.GetAllGroups())
            {
                group.ServerJoined += (s, a) => ServerJoinedGroup(s, a, server.RemoteServerManager.ServerID);
                group.ServerLeft   += (s, a) => ServerLeftGroup(s, a, server.RemoteServerManager.ServerID);
            }
#else
            servers.Add(0, server);

            server.ClientManager.ClientConnected += (s, a) => ClientConnected(s, a, 0);
#endif
        }
コード例 #30
0
        public void GivenTheServerIsUsingTheDispatcher(ushort serverID)
        {
            world.GetServer(serverID).ThreadHelper.EventsFromDispatcher = true;

            // Create a snapshot view of the server so we have a consistent reference to it between tests
            DarkRiftServer server = world.GetServer(serverID);

            dispatcherThread = new Thread(() =>
            {
                while (!server.Disposed)
                {
                    server.DispatcherWaitHandle.WaitOne();

                    server.ExecuteDispatcherTasks();
                }
            });
            dispatcherThread.Start();
        }