Exemplo n.º 1
0
    private void HandleClientPacket(byte[] buffer, int len)
    {
        int    dataIndex = 0;
        Packet packet    = PacketBuilder.Parse(buffer, ref dataIndex);

        switch (packet.Type)
        {
        case Packet.PacketType.Text:
            string text = ((PacketText)packet).Data;
            Debug.Log("[C->S]: " + text);
            break;

        case Packet.PacketType.Sensors:
            List <Trans> transforms = ((PacketSensors)packet).Data;
            break;

        case Packet.PacketType.Benchmark:
            NetBenchmarks b = ((PacketBenchmark)packet).Data;
            Debug.Log("RTT: " + (b.recvTimeStamp - b.sendTimeStamp) + " ms.");
            break;

        default:
            Debug.Assert(false);
            Debug.LogError("Invalid PacketType" + " (" + packet.Size + " of " + len + " bytes)");
            break;
        }
    }
Exemplo n.º 2
0
    private void OnMsgRecv(object sender, Server.ServerMsgEventArgs e)
    {
        if (!connectionManager.Contains(e.Client))
        {
            // Do this only if it is a new connection
            Packet p = PacketBuilder.Build(Packet.PacketType.Text, Constants.WelcomeMsg);
            server.Send(e.Client, p.ToArray(), p.Size);
            //Debug.Log("[S->C]: Welcome");

            Trans spawn = spawnTrans[connectionManager.Count % spawnTrans.Count];
            p = PacketBuilder.Build(Packet.PacketType.Spawn, spawn);
            server.Send(e.Client, p.ToArray(), p.Size);
            //Debug.Log("[S->C]: Spawn");
        }
        Connection connection = connectionManager.AddOrUpdateConnection(e.Client);

        int    dataIndex = 0;
        Packet packet    = PacketBuilder.Parse(e.Buffer, ref dataIndex);

        switch (packet.Type)
        {
        case Packet.PacketType.Text:
            string text = ((PacketText)packet).Data;
            if (text == Constants.ServeRequest)
            {
                Debug.Log("Serving Ball");
                ballController.serve = true;
            }
            Debug.Log("[C(" + e.Client + ")->S]: " + text
                      + " (" + packet.Size + " of " + e.Len + " bytes)");
            foreach (var c in connectionManager.Connections)
            {
                if (c.endPoint == e.Client)
                {
                    continue;
                }

                server.Send(c.endPoint, packet.ToArray(), packet.Size);
            }
            break;

        case Packet.PacketType.Sensors:
            List <Trans> transforms = ((PacketSensors)packet).Data;
            connection.clientData.Update(transforms);
            break;

        case Packet.PacketType.Benchmark:
            NetBenchmarks b = ((PacketBenchmark)packet).Data;
            Debug.Log("RTT: " + (b.recvTimeStamp - b.sendTimeStamp) + " ms.");
            break;

        default:
            Debug.Assert(false);
            Debug.LogError("Invalid PacketType" + " (" + packet.Size + " of " + e.Len + " bytes)");
            break;
        }
    }
Exemplo n.º 3
0
    private static IEnumerable <byte> GetPacketData(Packet.PacketType type, object data = null)
    {
        List <byte> content = new List <byte>();

        switch (type)
        {
        case Packet.PacketType.Text:
            string text = (string)data;
            content.AddRange(Encoding.ASCII.GetBytes(text));
            break;

        case Packet.PacketType.Sensors:
            List <Trans> transforms = (List <Trans>)data;
            content.Add((byte)transforms.Count);
            foreach (var transform in transforms)
            {
                content.AddRange(transform.Serialize());
            }
            break;

        case Packet.PacketType.Spawn:
            Trans spawn = (Trans)data;
            content.AddRange(spawn.Serialize());
            break;

        case Packet.PacketType.OtherClients:
            List <ClientData> clients = (List <ClientData>)data;
            content.Add((byte)clients.Count);
            foreach (var client in clients)
            {
                content.AddRange(client.Serialize());
            }
            break;

        case Packet.PacketType.Objects:
            List <Trans> objects = (List <Trans>)data;
            content.Add((byte)objects.Count);
            foreach (var trans in objects)
            {
                content.AddRange(trans.Serialize());
            }
            break;

        case Packet.PacketType.Benchmark:
            NetBenchmarks benchmarks = (NetBenchmarks)data;
            content.AddRange(BitConverter.GetBytes(benchmarks.sendTimeStamp));
            content.AddRange(BitConverter.GetBytes(benchmarks.recvTimeStamp));
            break;

        default:
            throw new ArgumentException("Invalid PacketType!");
        }

        return(content);
    }
    // Process the received packets, returns true on success or false if anything went wrong
    private bool HandleClientPacket(ClientData client, byte[] data, int size)
    {
        lock (clientsLock)
        {
            if (size == 0)
            {
                // The client has disconnected
                return(false);
            }

            // The data received can contain more than one packet! Keep reading packets until there is data left
            int dataIndex = 0;
            while (dataIndex < size)
            {
                // Parse a packet from the data buffer
                Packet packet = PacketBuilder.Parse(data, ref dataIndex);

                // Process the packet
                switch (packet.Type)
                {
                case Packet.PacketType.Text:
                    // Extract text string from the packet
                    string text = ((PacketText)packet).Data;
                    if (text == Constants.ServeRequest)
                    {
                        // Trigger the ballController if the text was a serve request
                        Debug.Log("Serving Ball");
                        ballController.serve = true;
                    }
                    Debug.Log("[C(" + client.socket.RemoteEndPoint + ")->S]: " + text
                              + " (" + packet.Size + " of " + size + " bytes)");

                    // Relay the message to all the other clients
                    foreach (var c in clients)
                    {
                        if (c.socket.Handle == client.socket.Handle)
                        {
                            continue;
                        }

                        Send(c.socket, packet);
                    }
                    break;

                case Packet.PacketType.Sensors:
                    // Extract the client transforms from the packet and update the client transforms appropriately
                    List <Trans> transforms = ((PacketSensors)packet).Data;
                    foreach (Trans t in transforms)
                    {
                        client.SetTransform(t.Id, t);
                    }
                    break;

                case Packet.PacketType.Benchmark:
                    NetBenchmarks b = ((PacketBenchmark)packet).Data;
                    Debug.Log("RTT: " + (b.recvTimeStamp - b.sendTimeStamp) + " ms.");
                    break;

                default:
                    // Unknown Packet Type
                    Debug.Assert(false);
                    Debug.LogError("Invalid PacketType" + " (" + packet.Size + " of " + size + " bytes)");
                    //return false;
                    break;
                }
            }

            return(true);
        }
    }
Exemplo n.º 5
0
    private bool HandleServerPacket(byte[] data, int size)
    {
        if (size == 0)
        {
            Debug.Log("Disconnected from the server");
            return(false);
        }

        int dataIndex = 0;

        // Keep reading while there is data left in the buffer
        while (dataIndex < size)
        {
            // Parse a packet from the data buffer
            Packet packet = PacketBuilder.Parse(data, ref dataIndex);

            // Process the packet
            switch (packet.Type)
            {
            case Packet.PacketType.Text:
                recvText        = ((PacketText)packet).Data;
                receivedNewText = true;
                Debug.Log("[S->C]: " + recvText + " (" + packet.Size + " of " + size + " bytes)");
                break;

            case Packet.PacketType.Spawn:
                spawn       = ((PacketSpawn)packet).Data;
                justSpawned = true;
                Debug.Log("[S->C]: Spawn Position = " + spawn.Pos + " (" + packet.Size + " of " + size + " bytes)");
                break;

            case Packet.PacketType.OtherClients:
                var others = ((PacketOtherClients)packet).Data;
                foreach (var c in others)
                {
                    // Add or update an oponent by its Id (and restore its TTL)
                    Oponent oponent = oponents.AddOponent(c.Id);
                    for (int i = 0; i < c.TransCount; i++)
                    {
                        oponent.AddTransform(c.GetTrans(i));
                    }
                }
                break;

            case Packet.PacketType.Objects:
                List <Trans> objectsRecv = ((PacketObjects)packet).Data;
                foreach (var o in objectsRecv)
                {
                    Trans t = objects.Where(x => x.Id == o.Id).FirstOrDefault();
                    if (t == null)
                    {
                        Debug.Log("Received " + o.Id + " for the first time");
                        objects.Add(o);
                    }
                    else
                    {
                        t.Pos = o.Pos;
                        t.Rot = o.Rot;
                    }
                }
                break;

            case Packet.PacketType.Benchmark:
                NetBenchmarks b = ((PacketBenchmark)packet).Data;
                b.recvTimeStamp = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
                PacketBuilder.Build(Packet.PacketType.Benchmark, b).Send(socket, new AsyncCallback(SendCallback));
                break;

            default:
                Debug.Assert(false);
                Debug.LogError("Invalid PacketType" + " (" + packet.Size + " of " + size + " bytes)");
                break;
            }
        }

        return(true);
    }
Exemplo n.º 6
0
    private void OnMsgRecv(object sender, Client.ClientMsgEventArgs e)
    {
        if (e.Len == 0)
        {
            Debug.Log("Disconnected from the server");
            online = false;
            return;
        }
        online = true;

        int    dataIndex = 0;
        Packet packet    = PacketBuilder.Parse(e.Buffer, ref dataIndex);

        // Process the packet
        switch (packet.Type)
        {
        case Packet.PacketType.Text:
            recvText        = ((PacketText)packet).Data;
            receivedNewText = true;
            Debug.Log("[S->C]: " + recvText + " (" + packet.Size + " of " + e.Len + " bytes)");
            break;

        case Packet.PacketType.Spawn:
            spawn       = ((PacketSpawn)packet).Data;
            justSpawned = true;
            Debug.Log("[S->C]: Spawn Position = " + spawn.Pos + " (" + packet.Size + " of " + e.Len + " bytes)");
            break;

        case Packet.PacketType.OtherClients:
            var others = ((PacketOtherClients)packet).Data;
            foreach (var c in others)
            {
                // Add or update an oponent by its Id (and restore its TTL)
                Oponent oponent = oponents.AddOponent(c.Id);
                for (int i = 0; i < c.TransCount; i++)
                {
                    oponent.AddTransform(c.GetTrans(i));
                }
            }
            break;

        case Packet.PacketType.Objects:
            List <Trans> objectsRecv = ((PacketObjects)packet).Data;
            foreach (var o in objectsRecv)
            {
                Trans t = objects.Where(x => x.Id == o.Id).FirstOrDefault();
                if (t == null)
                {
                    Debug.Log("Received " + o.Id + " for the first time");
                    objects.Add(o);
                }
                else
                {
                    t.Pos = o.Pos;
                    t.Rot = o.Rot;
                }
            }
            break;

        case Packet.PacketType.Benchmark:
            NetBenchmarks b = ((PacketBenchmark)packet).Data;
            b.recvTimeStamp = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
            Packet p = PacketBuilder.Build(Packet.PacketType.Benchmark, b);
            client.Send(p.ToArray(), p.Size);
            break;

        default:
            Debug.Assert(false);
            Debug.LogError("Invalid PacketType" + " (" + packet.Size + " of " + e.Len + " bytes)");
            break;
        }
    }