using System.Net.Sockets; using System.Collections.Concurrent; using System.Threading; using System; using Google.Protobuf; using UnityEngine; public class TcpConnection { private TcpClient c; public ConcurrentQueue q; private Thread receiverThread; private Protocol.ServerClientPacket Receive() { byte[] b = new byte[4]; c.Client.Receive(b, 0, 4, SocketFlags.None); if (!BitConverter.IsLittleEndian) { // Invert byte order, in order to get little endian byte order byte a = b[0]; b[0] = b[3]; b[3] = a; a = b[1]; b[1] = b[2]; b[2] = a; } int size = BitConverter.ToInt32(b, 0); byte[] data = new byte[size]; c.Client.Receive(data, 0, size, SocketFlags.None); return Protocol.ServerClientPacket.Parser.ParseFrom(data); } private void ReceiverThread() { Debug.Log("Started receiver thread"); while(true) { Protocol.ServerClientPacket packet = Receive(); q.Enqueue(packet); } } public TcpConnection(string address) { string[] ipAndPort = address.Split(':'); c = new TcpClient(ipAndPort[0], int.Parse(ipAndPort[1])); q = new ConcurrentQueue(); receiverThread = new Thread(new ThreadStart(ReceiverThread)); Debug.Log("Starting receiver thread"); receiverThread.Start(); } public void SendMessage(Protocol.ClientServerPacket packet) { int size = packet.CalculateSize(); byte[] sizeBytes = BitConverter.GetBytes(size); if (!BitConverter.IsLittleEndian) { // Invert byte order, in order to get little endian byte order byte a = sizeBytes[0]; sizeBytes[0] = sizeBytes[3]; sizeBytes[3] = a; a = sizeBytes[1]; sizeBytes[1] = sizeBytes[2]; sizeBytes[2] = a; } Debug.Log("Size: " + size); c.Client.Send(sizeBytes); byte[] data = packet.ToByteArray(); c.Client.Send(data); } }