/// <summary> /// Starts up the server. There can only be one active server per application instance, /// and only one server per port per machine. /// The NetPeerConfiguration allows for more customization and optimisation of the server. /// </summary> /// <param name="name">The name of the server to create. Cannot be null or blank.</param> /// <param name="config">The NetPeerConfiguration to use on the server. Should at least specify port number.</param> public static void StartServer(string name, NetPeerConfiguration config) { if (!Initialized) { Error("Call Init() before starting the server."); return; } if (IsServer) { Error("A server is already active. Shutdown the old server before opening this new one."); return; } if (string.IsNullOrWhiteSpace(name)) { Error("Name for new server is null, server starting cancelled."); return; } if (config == null) { Error("Config is null, server starting cancelled."); return; } try { config.EnableMessageType(NetIncomingMessageType.ConnectionApproval); config.AcceptIncomingConnections = true; JNetServer s = new JNetServer(name, config); s.Start(); JNet.Server = s; Log("Server now active on port " + config.Port); } catch (Exception e) { throw new JNetException(string.Format("Exception creating and starting server. See inner exception ({0})", e.GetType().FullName), e); } bool didUnregister = Tracker.Reset(); if (didUnregister) { Error("When server was activated, networked objects had to be untracked. Is the client connected to a different remote server?"); } // Register existing scene objects... if (EnableSceneObjectNetworking) { RegisterAllSceneObjects(); } }
/// <summary> /// Shuts down and disposes of the currently active server, disconnecting all clients. /// </summary> /// <param name="bye">The message to display to disconnected clients.</param> public static void ShutdownServer(string bye) { if (!IsServer) { Error("Server is already shut down and disposed."); return; } Server.Shutdown(bye); Server = null; Tracker.Reset(); Log("Server shut down and disposed of."); }
public void SerializeAll() { if (!JNet.IsServer) { JNet.Error("Not on server, cannot serialize all."); return; } for (int i = 0; i < ActiveObjects.Count; i++) { var obj = ActiveObjects[i]; if(obj == null) { JNet.Error("Null object in tracked objects list."); ActiveObjects.RemoveAt(i); i--; continue; } if(obj.NetBehaviours != null) { foreach (var b in obj.NetBehaviours) { if(b != null && b.NetDirty) { JNetServer server = JNet.GetServer(); NetOutgoingMessage msg = server.CreateMessage(); msg.Write((byte)JDataType.SERIALIZED); msg.Write(obj.NetID); msg.Write(b.BehaviourID); b.NetSerialize(msg, false); server.SendToAllExcept(server.LocalClientConnection, msg, b.SerializationDeliveryMethod, 1); b.NetDirty = false; } } } } }