//<summary> // Starts the sending of a strings method and its paramaters. For now the GUUID is auto added. //</summary> public static void Send(String MethodName, params object[] data) { List <object> tempData = data.ToList <object>(); //TODO: find a better way to auto add uuid's for methods that use it on server side tempData.Add(playerUUID); byte[] messageData = AltimitConverter.SendConversion(MethodName, tempData.ToArray()); sendSocket.BeginSend(messageData, 0, messageData.Length, 0, new AsyncCallback(SendCallBack), sendSocket); }
//<summary> // Once the data has been recieved from the socket this is ran. //</summary> private static void ReceiveCallBack(IAsyncResult ar) { threadList.Add(Thread.CurrentThread); byte[] key = { 5, 9, 0, 4 }; int messageSize = 0; int messageOffset = 0; byte[] currentMessage; try{ if (isConnected()) { StateObject state = (StateObject)ar.AsyncState; Socket client = state.workSocket; int buffSize = client.EndReceive(ar); do { if (buffSize != 0 || fullMessage.Length != 0) { if (fullMessage.Length != 0 && buffSize != 0) { Array.Resize(ref fullMessage, fullMessage.Length + buffSize); byte[] newMessage = new byte[buffSize]; newMessage = AltimitArray.copyOfRange(state.buffer, 0, buffSize); Array.ConstrainedCopy(newMessage, 0, fullMessage, fullMessageSize, newMessage.Length); messageSize = 0; } else if (buffSize != 0) { fullMessage = new byte[buffSize]; fullMessage = AltimitArray.copyOfRange(state.buffer, 0, buffSize); messageSize = 0; } else if (fullMessage.Length != 0) { messageSize = 0; } if (messageSize == 0 && fullMessage.Length >= 4) { messageSize = AltimitConverter.convertToInt(AltimitArray.copyOfRange(fullMessage, 0, 4)); if (messageSize <= fullMessage.Length) { byte[] messageKey = AltimitArray.copyOfRange(fullMessage, messageSize - 4, messageSize); if (key.SequenceEqual(messageKey)) { currentMessage = new byte[messageSize - 8]; messageOffset = 4; Array.ConstrainedCopy(fullMessage, messageOffset, currentMessage, 0, currentMessage.Length); messageOffset = messageSize; new Thread(() => { List <object> sentMessage = AltimitConverter.ReceiveConversion(currentMessage); InvokeMessage(sentMessage); }).Start(); fullMessage = AltimitArray.copyOfRange(fullMessage, messageOffset, fullMessage.Length); fullMessageSize = fullMessage.Length; buffSize = 0; } else { Debug.Log("Key was not found. Message will try to be completed in next read!"); } } else { break; } } else { break; } } }while(fullMessage.Length > 0); client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallBack), state); } else { Disconnect(); return; } } catch (Exception e) { Debug.LogError(e.ToString()); Disconnect(); return; } }