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; } }
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; } }
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); } }
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); }
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; } }