Esempio n. 1
0
        /// <summary>
        /// Method is called on each update to check for new messages
        /// </summary>
        private void ReadNetwork()
        {
            NetIncomingMessage msg;

            while ((msg = Client.ReadMessage()) != null)
            {
                switch (msg.MessageType)
                {
                case NetIncomingMessageType.DiscoveryResponse:
                    Client.Connect(msg.SenderEndPoint);
                    Maps map = (Maps)msg.ReadByte();
                    LoadMap(map);
                    break;

                case NetIncomingMessageType.StatusChanged:
                    //register action for when we have loaded all entities
                    NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte();
                    Console.WriteLine(status);
                    Console.WriteLine(msg.ReadString());
                    //on successful connect, we add the loadfinish method, which should immediately fire as
                    //everything probably has loaded yet
                    if (status == NetConnectionStatus.Connected)
                    {
                        Console.WriteLine("connection successful");
                        Scene.OnEmptyEntitiesToAdd += LoadFinish;
                    }
                    break;

                case NetIncomingMessageType.VerboseDebugMessage:
                case NetIncomingMessageType.DebugMessage:
                case NetIncomingMessageType.WarningMessage:
                case NetIncomingMessageType.ErrorMessage:
                    Console.WriteLine(msg.ReadString());
                    break;

                case NetIncomingMessageType.Data:
                    //the first four bytes in each message contain the type.
                    NetworkMessageType info = (NetworkMessageType)msg.ReadByte();
                    //notify everyone who wanted to be notified upon message arrival
                    OnClientData?.Invoke(Client, new NetworkEventArgs(msg, info));
                    break;

                default:
                    Console.WriteLine("Unhandled type: " + msg.MessageType);
                    break;
                }
                Client.Recycle(msg);
            }
        }
        private void AcceptCallback(IAsyncResult ar)
        {
            CancellationToken cancellationToken = (CancellationToken)ar.AsyncState;

            _waiterConnection.Release();
            Socket handler = _listenerSocket.EndAccept(ar);

            _logger.LogDebug($"Client connected - Handle: " + handler.Handle);
            var connection = _container.Resolve <TCPConnection>(new TypedParameter(typeof(Socket), handler));

            _connections.TryAdd(handler.Handle, connection);

            connection.OnReceivePacket += (s, e) => OnClientData?.Invoke(this, new Message((IConnection)s, e));
            connection.OnDisconnect    += (s, e) => OnClientDisconnect?.Invoke(this, (IConnection)s);

            OnClientConnect?.Invoke(this, connection);
            connection.StartListenData(cancellationToken, _options.Source, true);
        }