using System.IO; 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]; int receivedBytes = c.Client.Receive(b, 0, 4, SocketFlags.None); if (receivedBytes != 4) { return null; } 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); Debug.Log("Recieved " + size + " bytes"); return Protocol.ServerClientPacket.Parser.ParseFrom(data); } private void ReceiverThread() { Debug.Log("Started receiver thread"); while (true) { Protocol.ServerClientPacket packet = Receive(); if (packet == null) { break; } q.Enqueue(packet); } Debug.Log("Stopped receiver thread"); } public void Close() { receiverThread.Join(); } 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; } c.Client.Send(sizeBytes); byte[] data = packet.ToByteArray(); c.Client.Send(data); } }