UDP messages working

handTracking
Kyle Johnsen 2022-01-05 14:08:03 -05:00
parent 5d573f6f8d
commit 4bebb9e779
4 changed files with 116 additions and 13 deletions

View File

@ -109,6 +109,7 @@ public class PlayerController : NetworkObject, Dissonance.IDissonancePlayer
byte[] b = Encoding.UTF8.GetBytes(dissonanceID); byte[] b = Encoding.UTF8.GetBytes(dissonanceID);
owner.sendMessage(this, "d", b); owner.sendMessage(this, "d", b);
}; };
owner.manager.setupMessageGroup("close", closePlayers.ToArray());
} }
} }
if (owner.isLocal) if (owner.isLocal)
@ -126,7 +127,7 @@ public class PlayerController : NetworkObject, Dissonance.IDissonancePlayer
byte[] lastAudioIdBytes = BitConverter.GetBytes(lastAudioId++); byte[] lastAudioIdBytes = BitConverter.GetBytes(lastAudioId++);
Buffer.BlockCopy(lastAudioIdBytes, 0, toSend, 0, 4); Buffer.BlockCopy(lastAudioIdBytes, 0, toSend, 0, 4);
Buffer.BlockCopy(data.Array, data.Offset, toSend, 4, data.Count); 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
} }
} }

View File

@ -1820,7 +1820,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 03a4d4e1a7fd74c7ab2eccca4ce168db, type: 3} m_Script: {fileID: 11500000, guid: 03a4d4e1a7fd74c7ab2eccca4ce168db, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
host: neko.ugavel.com host: 127.0.0.1
port: 3290 port: 3290
userid: -1 userid: -1
room: room:

View File

@ -6,6 +6,8 @@ using System.Text;
using System.Threading; using System.Threading;
using UnityEngine; using UnityEngine;
using Dissonance; using Dissonance;
using System.Net;
public class NetworkManager : MonoBehaviour public class NetworkManager : MonoBehaviour
{ {
public enum MessageType { OTHERS=0,ALL=1,OTHERS_ORDERED=2,ALL_ORDERED=3}; public enum MessageType { OTHERS=0,ALL=1,OTHERS_ORDERED=2,ALL_ORDERED=3};
@ -13,10 +15,15 @@ public class NetworkManager : MonoBehaviour
public int port; public int port;
#region private members #region private members
private TcpClient socketConnection; private TcpClient socketConnection;
private Socket udpSocket;
public bool udpConnected = false;
IPEndPoint RemoteEndPoint;
private Thread clientReceiveThread; private Thread clientReceiveThread;
private Thread clientReceiveThreadUDP;
public int userid = -1; public int userid = -1;
public string room; public string room;
int messagesReceived = 0; int messagesReceived = 0;
public GameObject playerPrefab; public GameObject playerPrefab;
public Dictionary<int, NetworkPlayer> players = new Dictionary<int, NetworkPlayer>(); public Dictionary<int, NetworkPlayer> players = new Dictionary<int, NetworkPlayer>();
@ -64,6 +71,11 @@ public class NetworkManager : MonoBehaviour
{ {
this.userid = m.sender; this.userid = m.sender;
Debug.Log("joined server"); Debug.Log("joined server");
//start the udp thread
clientReceiveThreadUDP = new Thread(new ThreadStart(ListenForDataUDP));
clientReceiveThreadUDP.IsBackground = true;
clientReceiveThreadUDP.Start();
} }
if (m.type == 2) if (m.type == 2)
@ -87,6 +99,8 @@ public class NetworkManager : MonoBehaviour
player.room = m.text; player.room = m.text;
player.manager = this; player.manager = this;
onJoinedRoom(player); onJoinedRoom(player);
} }
} }
else //not for me, a player is joining or leaving 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 = new Thread(new ThreadStart(ListenForData));
clientReceiveThread.IsBackground = true; clientReceiveThread.IsBackground = true;
clientReceiveThread.Start(); clientReceiveThread.Start();
} }
catch (Exception e) catch (Exception e)
{ {
@ -322,6 +339,8 @@ public class NetworkManager : MonoBehaviour
} }
} }
} }
catch (Exception socketException) catch (Exception socketException)
{ {
Debug.Log("Socket exception: " + socketException); Debug.Log("Socket exception: " + socketException);
@ -329,6 +348,74 @@ public class NetworkManager : MonoBehaviour
} }
connected = false; 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);
}
/// <summary> /// <summary>
/// Send message to server using socket connection. /// Send message to server using socket connection.
/// </summary> /// </summary>
@ -370,14 +457,29 @@ public class NetworkManager : MonoBehaviour
{ {
SendNetworkMessage("2:-1"); SendNetworkMessage("2:-1");
} }
public void sendTo(MessageType type, string message) public void sendTo(MessageType type, string message, bool reliable=true)
{
if (reliable)
{ {
SendNetworkMessage("3:" + (int)type + ":" + message); SendNetworkMessage("3:" + (int)type + ":" + message);
} }
public void sendToGroup(string group, string message) else
{
SendUdpMessage(userid + ":3:" + (int)type + ":" + message);
}
}
public void sendToGroup(string group, string message, bool reliable=true)
{
if (reliable)
{ {
SendNetworkMessage("4:" + group + ":" + message); SendNetworkMessage("4:" + group + ":" + message);
} }
else
{
SendUdpMessage(userid + ":4:" + group + ":" + message);
}
}
//changes the designated group that sendto(4) will go to //changes the designated group that sendto(4) will go to
public void setupMessageGroup(string groupname, int[] userids) public void setupMessageGroup(string groupname, int[] userids)
{ {

View File

@ -159,27 +159,27 @@ public class NetworkPlayer : MonoBehaviour
//FindObjectsOfType<NetworkObject>(); //FindObjectsOfType<NetworkObject>();
} }
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) if (obj == myObject)
{ {
manager.sendToGroup(group, "1," + identifier + "," + Convert.ToBase64String(data)); manager.sendToGroup(group, "1," + identifier + "," + Convert.ToBase64String(data), reliable);
} }
else 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) 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 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);
} }
} }