Exemplo n.º 1
0
        private string TranslateTCP(TcpClient client, EN_TCP_PACKET_TYPE type, byte[] bytes)
        {
            string s = "";

            if (type == EN_TCP_PACKET_TYPE.CONNECT)
            {
                EN_PacketConnect packet = EN_Protocol.BytesToObject <EN_PacketConnect>(bytes);

                // Resend older important messages from before
                ResendStackTCP(client);

                // Send out this connection packet to the rest of the clients
                BroadcastAllTCP(bytes);

                // Add connect request to the stack of important messages
                packet_stack.Add(bytes);

                s = packet.packet_client_name + " connected.";

                IPEndPoint temp = (IPEndPoint)client.Client.RemoteEndPoint;
                udp_clients.Add(temp);
                // Add client to list of unique ID's
                //clients.Add(new EN_ClientInfo(client, packet.packet_client_guid, packet.packet_client_name));
            }
            if (type == EN_TCP_PACKET_TYPE.MESSAGE)
            {
                EN_PacketMessage packet = EN_Protocol.BytesToObject <EN_PacketMessage>(bytes);
                s = packet.packet_message;
            }
            if (type == EN_TCP_PACKET_TYPE.SPAWN_OBJECT)
            {
                EN_PacketSpawnObject packet = EN_Protocol.BytesToObject <EN_PacketSpawnObject>(bytes);

                current_networkID++;
                networkIDs.Add(packet.packet_network_id, current_networkID);

                packet.packet_network_id = networkIDs[packet.packet_network_id];

                byte[] bytes_data = EN_Protocol.ObjectToBytes(packet);

                BroadcastTCP(client, bytes_data);

                s = packet.packet_prefab + " with network ID " + packet.packet_network_id + " was spawned.";
            }
            if (type == EN_TCP_PACKET_TYPE.REMOVE_OBJECT)
            {
                EN_PacketRemoveObject packet = EN_Protocol.BytesToObject <EN_PacketRemoveObject>(bytes);

                packet.packet_network_id = networkIDs[packet.packet_network_id];

                byte[] bytes_data = EN_Protocol.ObjectToBytes(packet);

                BroadcastTCP(client, bytes_data);

                s = "Prefab with network ID " + packet.packet_network_id + " was removed.";
            }

            return(s);
        }
Exemplo n.º 2
0
    /*  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
    *   Constantly send updates (translate/rotate etc)
    *   -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  */
    public void SendUDP(object obj)
    {
        if (connected == false)
        {
            return;
        }

        EN_Protocol.SendUDP(udp_client, server, obj);
    }
Exemplo n.º 3
0
    private void TranslateUDP(EN_UDP_PACKET_TYPE type, byte[] bytes)
    {
        if (type == EN_UDP_PACKET_TYPE.TRANSFORM)
        {
            EN_PacketTransform packet = EN_Protocol.BytesToObject <EN_PacketTransform>(bytes);

            GameObject go = EN_NetworkObject.Find(packet.packet_network_id);
            if (go != null)
            {
                go.GetComponent <EN_SyncTransformClient>().Translate(packet.tX, packet.tY, packet.tZ, packet.rX, packet.rY, packet.rZ, packet.vX, packet.vY, packet.vZ);
            }
        }
    }
Exemplo n.º 4
0
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            EN_Protocol.SendTCP(stream, new EN_PacketMessage("Hello!"));
        }
        if (Input.GetKeyDown(KeyCode.F1))
        {
            GameObject go = Instantiate(EN_NetworkPrefabs.Prefab(EN_PREFABS.Cube), Vector3.zero, Quaternion.identity);
            go.AddComponent <EN_SyncTransform>().syncFrameRate = 10;
            go.GetComponent <EN_SyncTransformClient>().enabled = false;

            Vector3 pos = go.transform.position;
            Vector3 rot = go.transform.rotation.eulerAngles;

            EN_PacketSpawnObject packet;
            packet.packet_type       = EN_TCP_PACKET_TYPE.SPAWN_OBJECT;
            packet.packet_prefab     = EN_PREFABS.Cube;
            packet.packet_network_id = go.GetInstanceID();
            packet.tX = pos.x; packet.tY = pos.y; packet.tZ = pos.z;
            packet.rX = rot.x; packet.rY = rot.y; packet.rZ = rot.z;

            EN_Protocol.SendTCP(stream, packet);
        }
        if (Input.GetKeyDown(KeyCode.F2))
        {
            //remove
            Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit))
            {
                int id = hit.transform.gameObject.GetInstanceID();
                Destroy(hit.transform.gameObject);


                EN_PacketRemoveObject packet;
                packet.packet_type       = EN_TCP_PACKET_TYPE.REMOVE_OBJECT;
                packet.packet_network_id = id;

                EN_Protocol.SendTCP(stream, packet);
            }
        }

        udp_in.text = TrafficInUDP().ToString();
        tcp_in.text = TrafficInTCP().ToString();

        udpBytesIn = 0;
        tcpBytesIn = 0;
    }
Exemplo n.º 5
0
        private void TranslateUDP(IPEndPoint source, EN_UDP_PACKET_TYPE type, byte[] bytes)
        {
            if (type == EN_UDP_PACKET_TYPE.TRANSFORM)
            {
                EN_PacketTransform packet = EN_Protocol.BytesToObject <EN_PacketTransform>(bytes);

                // This comes in as a Unity InstanceID, we need to networkID-it
                packet.packet_network_id = networkIDs[packet.packet_network_id];

                byte[] bytes_data = EN_Protocol.ObjectToBytes(packet);

                BroadcastUDP(source, bytes_data);
            }
        }
Exemplo n.º 6
0
        private void ReceiveUDP(int loops)
        {
            if (udp_server.Available > 0)
            {
                byte[] bytes = udp_server.Receive(ref udp_source); //TODO: If Receive fails again after DC, try {} catch {} and spit it into console

                if (bytes.Length > 0)
                {
                    // Get & translate first 4 bytes
                    EN_UDP_PACKET_TYPE packet_type = EN_Protocol.BytesToUDPType(bytes);

                    TranslateUDP(udp_source, packet_type, bytes);
                }
            }
        }
Exemplo n.º 7
0
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            EN_Protocol.SendTCP(stream, new EN_PacketMessage("Hello!"));
        }
        if (Input.GetKeyDown(KeyCode.F1))
        {
            GameObject go = SpawnObject(EN_PREFABS.Cube, new Vector3(UnityEngine.Random.Range(-5, 5), 0, 5), Vector3.zero);

            Vector3 pos = go.transform.position;
            Vector3 rot = go.transform.rotation.eulerAngles;

            EN_PacketSpawnObject packet;
            packet.packet_type       = EN_TCP_PACKET_TYPE.SPAWN_OBJECT;
            packet.packet_prefab     = EN_PREFABS.Cube;
            packet.packet_network_id = go.GetInstanceID();
            packet.tX = pos.x; packet.tY = pos.y; packet.tZ = pos.z;
            packet.rX = rot.x; packet.rY = rot.y; packet.rZ = rot.z;

            EN_Protocol.SendTCP(stream, packet);
        }
        if (Input.GetKeyDown(KeyCode.F2))
        {
            //remove
            Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit))
            {
                int id = hit.transform.gameObject.GetInstanceID();
                Destroy(hit.transform.gameObject);


                EN_PacketRemoveObject packet;
                packet.packet_type       = EN_TCP_PACKET_TYPE.REMOVE_OBJECT;
                packet.packet_network_id = id;

                EN_Protocol.SendTCP(stream, packet);
            }
        }

        udp_in.text = TrafficInUDP().ToString();
        tcp_in.text = TrafficInTCP().ToString();

        udpBytesIn = 0;
        tcpBytesIn = 0;
    }
Exemplo n.º 8
0
        private void ResendStackTCP(TcpClient client)
        {
            NetworkStream stream = client.GetStream();

            // Re-broadcast all old messages
            for (int i = 0; i < packet_stack.Count; i++)
            {
                //stream.Write(BitConverter.GetBytes(packet_stack[i].Length), 0, 4);
                //stream.Write(packet_stack[i], 0, packet_stack[i].Length);
            }

            foreach (int key in objects.Keys)
            {
                EN_Protocol.SendTCP(stream, objects[key]);
            }
            for (int i = 0; i < networkIDs.Count; i++)
            {
            }
        }
Exemplo n.º 9
0
    private void TranslateTCP(EN_TCP_PACKET_TYPE type, byte[] bytes)
    {
        if (type == EN_TCP_PACKET_TYPE.CONNECT)
        {
            // Someone connected and we want to establish who it is
            EN_PacketConnect packet = EN_Protocol.BytesToObject <EN_PacketConnect>(bytes);

            if (packet.packet_client_guid.Equals(EN_ClientSettings.CLIENT_GUID) == true)
            {
                packet.packet_client_name += " (you)";
            }

            AddClient(packet.packet_client_guid, packet.packet_client_name);
        }
        if (type == EN_TCP_PACKET_TYPE.GAME_STATE)
        {
            EN_PacketGameState packet = EN_Protocol.BytesToObject <EN_PacketGameState>(bytes);
        }
        if (type == EN_TCP_PACKET_TYPE.SPAWN_OBJECT)
        {
            EN_PacketSpawnObject packet = EN_Protocol.BytesToObject <EN_PacketSpawnObject>(bytes);
            Vector3    pos = new Vector3(packet.tX, packet.tY, packet.tZ);
            Quaternion rot = Quaternion.Euler(packet.rX, packet.rY, packet.rZ);
            GameObject go  = Instantiate(EN_NetworkPrefabs.Prefab(packet.packet_prefab), pos, rot);
            go.AddComponent <EN_NetworkObject>().network_id = packet.packet_network_id;

            EN_NetworkObject.Add(packet.packet_network_id, go);

            ConsoleMessage(string.Format("Spawned {0} with network ID {1}", go.name, packet.packet_network_id));
        }
        if (type == EN_TCP_PACKET_TYPE.REMOVE_OBJECT)
        {
            EN_PacketRemoveObject packet = EN_Protocol.BytesToObject <EN_PacketRemoveObject>(bytes);

            GameObject go = EN_NetworkObject.Find(packet.packet_network_id);
            string     n  = go.name;
            EN_NetworkObject.Remove(packet.packet_network_id);
            Destroy(go);

            ConsoleMessage(string.Format("Removed {0} with network ID {1}", n, packet.packet_network_id));
        }
    }
Exemplo n.º 10
0
    private IEnumerator ReceiveUDP()
    {
        while (true)
        {
            while (udp_client.Available > 0)
            {
                byte[] bytes = udp_client.Receive(ref server);

                if (bytes.Length > 0)
                {
                    EN_UDP_PACKET_TYPE type = EN_Protocol.BytesToUDPType(bytes);
                    TranslateUDP(type, bytes);

                    udpBytesIn += (uint)bytes.Length;
                }
            }

            yield return(null);
        }
    }
Exemplo n.º 11
0
    private IEnumerator ReceiveTCP()
    {
        while (true)
        {
            if (tcp_client.Available > 0)
            {
                byte[] bytes_size = new byte[4];
                stream.Read(bytes_size, 0, 4);
                int bytesize = BitConverter.ToInt32(bytes_size, 0);

                byte[] bytes_data = new byte[bytesize];
                stream.Read(bytes_data, 0, bytesize);

                EN_TCP_PACKET_TYPE type = EN_Protocol.BytesToTCPType(bytes_data, 0);
                TranslateTCP(type, bytes_data);

                tcpBytesIn += (uint)bytes_size.Length + (uint)bytes_data.Length;
            }
            yield return(null);
        }
    }
Exemplo n.º 12
0
    public void ConnectClient()
    {
        udp_client = new UdpClient(); // EN_ServerSettings.HOSTNAME, EN_ServerSettings.PORT);
        tcp_client = new TcpClient(); // EN_ServerSettings.HOSTNAME, EN_ServerSettings.PORT);
        //tcp_client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);



        server  = new IPEndPoint(IPAddress.Parse(EN_ServerSettings.HOSTNAME), EN_ServerSettings.PORT);
        clients = new List <EN_ClientInfo>();

        EN_ClientSettings.CLIENT_NAME = text_name.text;
        EN_ClientSettings.CLIENT_GUID = Guid.NewGuid();

        if (EN_Protocol.Connect(tcp_client, server, EN_ClientSettings.CLIENT_NAME, EN_ClientSettings.CLIENT_GUID) == false)
        {
            Debug.Log("Not connected (TCP). Returning.");
            return;
        }


        IPEndPoint ep = (IPEndPoint)tcp_client.Client.LocalEndPoint;
        int        p  = ep.Port;

        udp_client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        udp_client.Client.Bind(new IPEndPoint(IPAddress.Any, p));
        EN_Protocol.Connect(udp_client, server);



        stream = tcp_client.GetStream();

        //StartCoroutine(SendUDP(EN_ClientSettings.SEND_INTERVAL));
        StartCoroutine(ReceiveUDP());


        StartCoroutine(ReceiveTCP());

        StartCoroutine(WaitForConnection(1.0f));
    }
Exemplo n.º 13
0
        private void ReceiveTCP()
        {
            for (int i = 0; i < tcp_clients.Count; i++)
            {
                if (tcp_clients[i].Available > 0)
                {
                    NetworkStream stream = tcp_clients[i].GetStream();


                    byte[] bytes_size = new byte[4];
                    stream.Read(bytes_size, 0, 4);
                    int bytesize = BitConverter.ToInt32(bytes_size, 0);

                    byte[] bytes_data = new byte[bytesize];
                    stream.Read(bytes_data, 0, bytesize);


                    EN_TCP_PACKET_TYPE packet_type = EN_Protocol.BytesToTCPType(bytes_data, 0);

                    IPEndPoint source = (IPEndPoint)tcp_clients[i].Client.RemoteEndPoint;
                    Console.WriteLine("TCP " + (source.Address.ToString() + ":" + source.Port.ToString() + ": " + TranslateTCP(tcp_clients[i], packet_type, bytes_data)));
                }
            }
        }