예제 #1
0
        //<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);
        }
예제 #2
0
        //<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;
            }
        }