public IPagenatedMessage BreakdownMessage(BMSByte messageBuffer) { if (messageBuffer.Size == 0) { throw new CantBreakdownEmptyMessageException(); } int offset = 0; var pm = AbstractFactory.Get <INetworkTypeFactory>().GetNew <IPagenatedMessage>(); pm.Buffer = messageBuffer; int messageId = NextId(); int pageCount = ((messageBuffer.Size - 1) / MaxPageLength) + 1; int totalSize = messageBuffer.Size + (pageCount * HeaderLength); messageBuffer.SetArraySize(totalSize); do { BMSByte header = GetHeader(messageId, pm.Pages.Count, totalSize); var page = AbstractFactory.Get <INetworkTypeFactory>().GetNew <IMessagePage>(); page.StartOffset = offset; page.Length = System.Math.Min(messageBuffer.Size - offset, MaxPageLength) + header.Size; messageBuffer.InsertRange(offset, header); pm.Pages.Add(page); offset += page.Length; BufferPool.Release(header); } while (offset < messageBuffer.Size); return(pm); }
/// <summary> /// Gets the raw data for this frame /// </summary> /// <returns>The raw byte data prepared by this frame</returns> public byte[] GetData(bool makeReliable = false, NetworkingPlayer player = null) { if (makeReliable) { MakeReliable(player); reliableCloneData.Clone(StreamData); reliableCloneData.InsertRange(StreamData.Size - (sizeof(ulong) * 2), BitConverter.GetBytes(UniqueReliableId)); return(reliableCloneData.CompressBytes()); } return(StreamData.CompressBytes()); }
/// <summary> /// Tells the client to change their scene to the given scene. This is often called /// after the server has changed to that scene to ensure that the server will always /// load up the scene before the client does /// </summary> /// <param name="port">The port of the <see cref="NetWorker"/> that is to send the message</param> /// <param name="targetPlayer">The particular player that will be receiving this message</param> /// <param name="sceneName">The name of the scene in which the client should load</param> public static void ChangeClientScene(ushort port, NetworkingPlayer targetPlayer, string sceneName) { if (!Sockets.ContainsKey(port)) throw new NetworkException("There isn't a server running using the specified port on this machine"); if (!Sockets[port].IsServer) throw new NetworkException("Writing to particular players can only be done by the server, the NetWorker on the specified port is not a server"); BMSByte data = new BMSByte(); data.Clone(Encryptor.Encoding.GetBytes(sceneName)); data.InsertRange(0, new byte[1] { 2 }); Sockets[port].WriteRaw(data, false); }
/// <summary> /// Tells the client to change their scene to the given scene. This is often called /// after the server has changed to that scene to ensure that the server will always /// load up the scene before the client does /// </summary> /// <param name="netWorker">The current <see cref="NetWorker"/> that will be sending the message</param> /// <param name="targetPlayer">The particular player that will be receiving this message</param> /// <param name="sceneName">The name of the scene in which the client should load</param> public static void ChangeClientScene(NetWorker netWorker, NetworkingPlayer targetPlayer, string sceneName) { if (!netWorker.IsServer) throw new NetworkException("Only the server can call this method, the specified NetWorker is not a server"); BMSByte data = new BMSByte(); data.Clone(Encryptor.Encoding.GetBytes(sceneName)); data.InsertRange(0, new byte[1] { 2 }); netWorker.WriteRaw(targetPlayer, data); }
/// <summary> /// Allows the server to send a raw message to a particular player /// </summary> /// <param name="netWorker"></param> /// <param name="targetPlayer"></param> /// <param name="data"></param> public static void WriteRaw(NetWorker netWorker, NetworkingPlayer targetPlayer, BMSByte data) { data.InsertRange(0, new byte[1] { 1 }); netWorker.WriteRaw(targetPlayer, data); }
/// <summary> /// Write a custom raw byte message with a 1 byte header across the network /// </summary> /// <param name="id"></param> /// <param name="netWorker"></param> /// <param name="data"></param> public static void WriteRaw(NetWorker netWorker, BMSByte data) { if (data == null) { netWorker.ThrowException(new NetworkException(1000, "The data being written can not be null")); return; } if (data.Size == 0) { netWorker.ThrowException(new NetworkException(1001, "The data being sent can't be empty")); return; } data.InsertRange(0, rawTypeIndicator); netWorker.WriteRaw(data); }
/// <summary> /// Allows the server to send a raw message to a particular player /// </summary> /// <param name="netWorker"></param> /// <param name="targetPlayer"></param> /// <param name="data"></param> public static void WriteRaw(NetWorker netWorker, NetworkingPlayer targetPlayer, BMSByte data, string uniqueId, bool reliable = false) { data.InsertRange(0, new byte[1] { 1 }); netWorker.WriteRaw(targetPlayer, data, uniqueId, reliable); }
private static void Program1() { ConsoleBehavior obj = null; string serverIP = "127.0.0.1"; //string hostIP = "0.0.0.0"; //ushort port = NetWorker.DEFAULT_PORT; //ushort masterServerPort = 15940; //string natHost = "0.0.0.0"; BMSLog.Instance.RegisterLoggerService(new ConsoleLogger()); Console.Write("server or client: "); string serverOrClient = Console.ReadLine().ToLower(); if (serverOrClient == "client" || serverOrClient == "c") { networkHandle = new TCPClient(); ((TCPClient)networkHandle).Connect(serverIP /*, port*/); } else if (serverOrClient == "server" || serverOrClient == "s") { networkHandle = new TCPServer(32); ((TCPServer)networkHandle).Connect(); //RegisterOnMasterServer(networkHandle, 32, serverIP, masterServerPort); } //if (serverOrClient == "client" || serverOrClient == "c") //{ // networkHandle = new UDPClient(); // ((UDPClient)networkHandle).Connect(serverIP/*, port, natHost*/); //} //else if (serverOrClient == "server" || serverOrClient == "s") //{ // networkHandle = new UDPServer(32); // ((UDPServer)networkHandle).Connect(/*hostIP, port, natHost*/); //} else { Console.WriteLine("Invalid"); return; } networkHandle.textMessageReceived += ReadTextMessage; networkHandle.binaryMessageReceived += ReadBinaryMessage; NetworkObject.Factory = new NetworkObjectFactory(); networkHandle.objectCreated += (NetworkObject target) => { if (target is ConsoleNetworkObject) { obj = new ConsoleDerivedNetworkObject(); obj.Initialize(target); } }; networkHandle.serverAccepted += (sender) => { if (networkHandle is IClient) { new ConsoleNetworkObject(networkHandle); } }; while (true) { Console.Write("Enter a message: "); string message = Console.ReadLine(); if (message == "disconnect") { networkHandle.Disconnect(false); } else if (message == "exit") { break; } else if (message == "file") { BMSByte data = new BMSByte(); data.Clone(System.IO.File.ReadAllBytes("testSend.txt")); data.InsertRange(0, new byte[1] { 212 }); if (networkHandle is TCPServer) { ((TCPServer)networkHandle).SendAll(new Binary(networkHandle.Time.Timestep, false, data, Receivers.All, 55, true)); } else if (networkHandle is TCPClient) { ((TCPClient)networkHandle).Send(new Binary(networkHandle.Time.Timestep, true, data, Receivers.All, 55, true)); } else if (networkHandle is BaseUDP) { ((BaseUDP)networkHandle).Send(new Binary(networkHandle.Time.Timestep, false, data, Receivers.All, 55, false), false); } } else if (message == "rpc") { obj.networkObject.SendRpc(ConsoleBehavior.RPC_HELLO_WORLD, Receivers.AllBuffered, null, "World!"); } else if (message.StartsWith("set num to ")) { obj.networkObject.Num = int.Parse(message.Substring("set name to ".Length)); } else if (message == "num") { Console.WriteLine("Number is currently " + obj.networkObject.Num); } else { if (networkHandle is TCPServer) { obj.networkObject.SendRpc(ConsoleBehavior.RPC_HELLO_WORLD, Receivers.Others, message); } // ((TCPServer)networkHandle).SendAll(Text.CreateFromString(networkHandle.Time.Timestep, message, false, Receivers.All, 55, true)); else if (networkHandle is TCPClient) { ((TCPClient)networkHandle).Send(Text.CreateFromString(networkHandle.Time.Timestep, message, true, Receivers.All, 55, true)); } else if (networkHandle is BaseUDP) { ((BaseUDP)networkHandle).Send(Text.CreateFromString(networkHandle.Time.Timestep, message, false, Receivers.All, 55, false), true); } } } }