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); }
/* - - - - - - - - - - - - - - - - * Constantly send updates (translate/rotate etc) * - - - - - - - - - - - - - - - - */ public void SendUDP(object obj) { if (connected == false) { return; } EN_Protocol.SendUDP(udp_client, server, obj); }
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); } } }
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; }
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); } }
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); } } }
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; }
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++) { } }
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)); } }
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); } }
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); } }
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)); }
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))); } } }