예제 #1
0
        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);
        }
예제 #2
0
        /// <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());
        }
예제 #3
0
		/// <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);
		}
예제 #4
0
		/// <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);
		}
예제 #5
0
		/// <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);
		}
예제 #6
0
		/// <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);
		}
예제 #7
0
		/// <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);
		}
예제 #8
0
        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);
                    }
                }
            }
        }