diff --git a/TestVelGameServer/Assets/VelGameServer/Example/PlayerController.cs b/TestVelGameServer/Assets/VelGameServer/Example/PlayerController.cs index f733c35..3646aa6 100644 --- a/TestVelGameServer/Assets/VelGameServer/Example/PlayerController.cs +++ b/TestVelGameServer/Assets/VelGameServer/Example/PlayerController.cs @@ -109,6 +109,7 @@ public class PlayerController : NetworkObject, Dissonance.IDissonancePlayer byte[] b = Encoding.UTF8.GetBytes(dissonanceID); owner.sendMessage(this, "d", b); }; + owner.manager.setupMessageGroup("close", closePlayers.ToArray()); } } if (owner.isLocal) @@ -126,7 +127,7 @@ public class PlayerController : NetworkObject, Dissonance.IDissonancePlayer byte[] lastAudioIdBytes = BitConverter.GetBytes(lastAudioId++); Buffer.BlockCopy(lastAudioIdBytes, 0, toSend, 0, 4); Buffer.BlockCopy(data.Array, data.Offset, toSend, 4, data.Count); - owner.sendGroupMessage(this,"close", "a", toSend); + owner.sendGroupMessage(this,"close", "a", toSend, false); //send voice data unreliably } } diff --git a/TestVelGameServer/Assets/VelGameServer/Example/test.unity b/TestVelGameServer/Assets/VelGameServer/Example/test.unity index 8adc627..78dafca 100644 --- a/TestVelGameServer/Assets/VelGameServer/Example/test.unity +++ b/TestVelGameServer/Assets/VelGameServer/Example/test.unity @@ -1820,7 +1820,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 03a4d4e1a7fd74c7ab2eccca4ce168db, type: 3} m_Name: m_EditorClassIdentifier: - host: neko.ugavel.com + host: 127.0.0.1 port: 3290 userid: -1 room: diff --git a/TestVelGameServer/Assets/VelGameServer/NetworkManager.cs b/TestVelGameServer/Assets/VelGameServer/NetworkManager.cs index 3e37fd9..2663d88 100644 --- a/TestVelGameServer/Assets/VelGameServer/NetworkManager.cs +++ b/TestVelGameServer/Assets/VelGameServer/NetworkManager.cs @@ -6,6 +6,8 @@ using System.Text; using System.Threading; using UnityEngine; using Dissonance; +using System.Net; + public class NetworkManager : MonoBehaviour { public enum MessageType { OTHERS=0,ALL=1,OTHERS_ORDERED=2,ALL_ORDERED=3}; @@ -13,10 +15,15 @@ public class NetworkManager : MonoBehaviour public int port; #region private members private TcpClient socketConnection; + private Socket udpSocket; + public bool udpConnected = false; + IPEndPoint RemoteEndPoint; private Thread clientReceiveThread; + private Thread clientReceiveThreadUDP; public int userid = -1; public string room; int messagesReceived = 0; + public GameObject playerPrefab; public Dictionary players = new Dictionary(); @@ -64,7 +71,12 @@ public class NetworkManager : MonoBehaviour { this.userid = m.sender; Debug.Log("joined server"); - } + + //start the udp thread + clientReceiveThreadUDP = new Thread(new ThreadStart(ListenForDataUDP)); + clientReceiveThreadUDP.IsBackground = true; + clientReceiveThreadUDP.Start(); + } if (m.type == 2) { @@ -87,6 +99,8 @@ public class NetworkManager : MonoBehaviour player.room = m.text; player.manager = this; onJoinedRoom(player); + + } } else //not for me, a player is joining or leaving @@ -199,6 +213,9 @@ public class NetworkManager : MonoBehaviour clientReceiveThread = new Thread(new ThreadStart(ListenForData)); clientReceiveThread.IsBackground = true; clientReceiveThread.Start(); + + + } catch (Exception e) { @@ -322,6 +339,8 @@ public class NetworkManager : MonoBehaviour } } } + + catch (Exception socketException) { Debug.Log("Socket exception: " + socketException); @@ -329,6 +348,74 @@ public class NetworkManager : MonoBehaviour } connected = false; } + + private void ListenForDataUDP() + { + //I don't yet have a UDP connection + try + { + RemoteEndPoint = new IPEndPoint( + IPAddress.Parse(host), port); + udpSocket = new Socket(AddressFamily.InterNetwork, + SocketType.Dgram, ProtocolType.Udp); + + udpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); + udpConnected = false; + byte[] buffer = new byte[1024]; + while (true) + { + + string welcome = userid + ":0:Hello"; + byte[] data = Encoding.ASCII.GetBytes(welcome); + udpSocket.SendTo(data, data.Length, SocketFlags.None, RemoteEndPoint); + + if(udpSocket.Available == 0) + { + Thread.Sleep(100); + Debug.Log("Waiting for UDP response"); + } + else + { + break; + } + + + } + udpConnected = true; + while (true) { + int numReceived = udpSocket.Receive(buffer); + + string message = Encoding.UTF8.GetString(buffer, 0, numReceived); + + string[] sections = message.Split(':'); + if(sections[0] == "0") + { + Debug.Log("UDP connected"); + } + if(sections[0] == "3") + { + handleMessage(message); + } + } + + } catch(Exception socketException) + { + Debug.Log("Socket exception: " + socketException); + } + } + + private void SendUdpMessage(string message) + { + + if (udpSocket == null || !udpConnected) + { + return; + } + byte[] data = Encoding.UTF8.GetBytes(message); + Debug.Log("Attempting to send: " + message); + udpSocket.SendTo(data, data.Length, SocketFlags.None, RemoteEndPoint); + } + /// /// Send message to server using socket connection. /// @@ -370,14 +457,29 @@ public class NetworkManager : MonoBehaviour { SendNetworkMessage("2:-1"); } - public void sendTo(MessageType type, string message) + public void sendTo(MessageType type, string message, bool reliable=true) { - SendNetworkMessage("3:" + (int)type + ":" + message); + if (reliable) + { + SendNetworkMessage("3:" + (int)type + ":" + message); + } + else + { + SendUdpMessage(userid + ":3:" + (int)type + ":" + message); + } } - public void sendToGroup(string group, string message) + public void sendToGroup(string group, string message, bool reliable=true) { - SendNetworkMessage("4:" + group + ":" + message); + if (reliable) + { + SendNetworkMessage("4:" + group + ":" + message); + } + else + { + SendUdpMessage(userid + ":4:" + group + ":" + message); + } } + //changes the designated group that sendto(4) will go to public void setupMessageGroup(string groupname, int[] userids) { diff --git a/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs b/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs index ff2751f..bc9ae80 100644 --- a/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs +++ b/TestVelGameServer/Assets/VelGameServer/NetworkPlayer.cs @@ -159,27 +159,27 @@ public class NetworkPlayer : MonoBehaviour //FindObjectsOfType(); } - public void sendGroupMessage(NetworkObject obj, string group, string identifier, byte[] data) + public void sendGroupMessage(NetworkObject obj, string group, string identifier, byte[] data, bool reliable=true) { if (obj == myObject) { - manager.sendToGroup(group, "1," + identifier + "," + Convert.ToBase64String(data)); + manager.sendToGroup(group, "1," + identifier + "," + Convert.ToBase64String(data), reliable); } else { - manager.sendToGroup(group, "5," + obj.networkId + "," + identifier + "," + Convert.ToBase64String(data)); + manager.sendToGroup(group, "5," + obj.networkId + "," + identifier + "," + Convert.ToBase64String(data), reliable); } } - public void sendMessage(NetworkObject obj, string identifier, byte[] data) + public void sendMessage(NetworkObject obj, string identifier, byte[] data, bool reliable=true) { if (obj == myObject) { - manager.sendTo(NetworkManager.MessageType.OTHERS, "1," + identifier +"," + Convert.ToBase64String(data)); + manager.sendTo(NetworkManager.MessageType.OTHERS, "1," + identifier +"," + Convert.ToBase64String(data), reliable); } else { - manager.sendTo(NetworkManager.MessageType.OTHERS, "5," + obj.networkId + "," + identifier + "," + Convert.ToBase64String(data)); + manager.sendTo(NetworkManager.MessageType.OTHERS, "5," + obj.networkId + "," + identifier + "," + Convert.ToBase64String(data), reliable); } }