private static void TextMessageReceived(NetworkingPlayer player, Text frame, NetWorker sender)
        {
            try
            {
                System.Console.WriteLine($"TextMessageReceived() was called.");
                System.Console.WriteLine($"Call came from player with network-id {player.NetworkId}");
                System.Console.WriteLine($"Call data were as follows:");
                System.Console.WriteLine($"{frame.ToString()}");

                var json = JSON.Parse(frame.ToString());

                if (json["register"] != null)
                {
                    // A host is coming to register with this NAT server, thus declaring itself open for business.
                    // Remember, when the host _itself_ moves through its own firewall it signals to its operating
                    // system that it's safe to do traffic on that port - including _receiving_ traffic directly from clients.
                    string address = player.IPEndPointHandle.Address.ToString();
                    ushort port    = json["register"]["port"].AsUShort;

                    if (!hosts.ContainsKey(address))
                    {
                        hosts.Add(address, new List <Host>());
                    }

                    if (CheckAndUpdateRegisteredHost(player, address, port))
                    {
                        return;
                    }

                    RegisterNewHost(player, address, port);
                    System.Console.WriteLine($"New host was registrered on {address}:{port}");
                }
                else if (json["host"] != null && json["port"] != null)
                {
                    // A client is coming to register with this NAT server, i.e. it's looking for a host it believes it knows about.
                    // So let's see if we can find a suitable host for it.
                    server.Disconnect(player, false);

                    string addresss      = json["host"];
                    ushort port          = json["port"].AsUShort;
                    ushort listeningPort = json["clientPort"].AsUShort;

                    addresss = NetWorker.ResolveHost(addresss, port).Address.ToString();

                    if (!hosts.ContainsKey(addresss))
                    {
                        return;
                    }

                    Host foundHost = new Host();
                    foreach (Host iHost in hosts[addresss])
                    {
                        if (iHost.port == port)
                        {
                            foundHost = iHost;
                            break;
                        }
                    }


                    if (string.IsNullOrEmpty(foundHost.host))
                    {
                        return;
                    }

                    JSONNode obj = JSONNode.Parse("{}");
                    obj.Add("host", new JSONData(player.IPEndPointHandle.Address.ToString().Split(':')[0]));
                    obj.Add("port", new JSONData(listeningPort));

                    JSONClass sendObj = new JSONClass();
                    sendObj.Add("nat", obj);

                    Text notifyFrame = Text.CreateFromString(server.Time.Timestep, sendObj.ToString(), false, Receivers.Target, MessageGroupIds.NAT_ROUTE_REQUEST, false);

                    server.Send(foundHost.player, notifyFrame, true);
                    System.Console.WriteLine($"The client was sent info about a host - gg ahead.");
                }
            }
            catch (Exception ex)
            {
                System.Console.WriteLine($"An error occured in call to TextMessageReceived().");
                System.Console.WriteLine($"Call came from player with network-id {player.NetworkId}.");
                System.Console.WriteLine($"Error was '{ex.Message}'.");
                System.Console.WriteLine($"Calling server.Disconnect().");

                server.Disconnect(player, true);
            }
        }
Ejemplo n.º 2
0
        private static void TextMessageReceived(NetworkingPlayer player, Text frame, NetWorker sender)
        {
            try
            {
                var json = JSON.Parse(frame.ToString());

                if (json["register"] != null)
                {
                    string address = player.IPEndPointHandle.Address.ToString();
                    ushort port    = json["register"]["port"].AsUShort;

                    if (!hosts.ContainsKey(address))
                    {
                        hosts.Add(address, new List <Host>());
                    }

                    foreach (Host host in hosts[address])
                    {
                        // This host is already registered
                        if (host.port == port)
                        {
                            return;
                        }
                    }

                    System.Console.Write("Hosted Server received: ");
                    System.Console.Write(address);
                    System.Console.Write(":");
                    System.Console.Write(port);
                    System.Console.Write(" received");
                    System.Console.Write(System.Environment.NewLine);

                    hosts[address].Add(new Host(player, address, port));
                }
                else if (json["host"] != null && json["port"] != null)
                {
                    server.Disconnect(player, false);

                    string addresss      = json["host"];
                    ushort port          = json["port"].AsUShort;
                    ushort listeningPort = json["clientPort"].AsUShort;

                    addresss = NetWorker.ResolveHost(addresss, port).Address.ToString();

                    if (!hosts.ContainsKey(addresss))
                    {
                        return;
                    }

                    Host foundHost = new Host();
                    foreach (Host iHost in hosts[addresss])
                    {
                        if (iHost.port == port)
                        {
                            foundHost = iHost;
                            break;
                        }
                    }


                    if (string.IsNullOrEmpty(foundHost.host))
                    {
                        return;
                    }

                    JSONNode obj = JSONNode.Parse("{}");
                    obj.Add("host", new JSONData(player.IPEndPointHandle.Address.ToString().Split(':')[0]));
                    obj.Add("port", new JSONData(listeningPort));

                    JSONClass sendObj = new JSONClass();
                    sendObj.Add("nat", obj);

                    Text notifyFrame = Text.CreateFromString(server.Time.Timestep, sendObj.ToString(), false, Receivers.Target, MessageGroupIds.NAT_ROUTE_REQUEST, false);

                    server.Send(foundHost.player, notifyFrame, true);
                }
            }
            catch
            {
                server.Disconnect(player, true);
            }
        }