Example #1
0
        private async void ProcessSocket(Socket socket)
        {
            Logger.Write("Connected from: " + socket.RemoteEndPoint);

            var session = new PacketSession(socket);
            _lock.DoWriteLock(() => _sessions.Add(session));
            Dispatch(new ConnectionPacket { Connected = true }, session);
            try
            {
                while (true)
                {
                    var packet = await session.Receive();
                    Dispatch(packet, session);
                }
            }
            catch (Exception e)
            {
                Logger.Write(e);
            }

            Dispatch(new ConnectionPacket {Connected = false}, session);
            _lock.DoWriteLock(() => _sessions.Remove(session));

            try
            {
                socket.Shutdown(SocketShutdown.Both);
            }
            catch
            {
            }
        }
Example #2
0
 public void BroadcastPacket(IPacket packet, PacketSession exceptSession = null)
 {
     _lock.DoReadLock(() =>
         {
             var targetSessions = exceptSession != null ? _sessions.Where(e => e != exceptSession) : _sessions;
             foreach (var session in targetSessions)
                 session.Send(packet);
         });
 }
Example #3
0
 public void BroadcastPacket(IPacket packet, PacketSession exceptSession = null)
 {
     _listener.BroadcastPacket(packet, exceptSession);
 }
Example #4
0
 public GameObject RemovePlayer(PacketSession playerSession)
 {
     const int retryCount = 64;
     var objectId = 0;
     return Enumerable.Range(0, retryCount).Any(_ => _sessions.TryRemove(playerSession, out objectId))
                ? RemoveGameObject(objectId)
                : null;
 }
Example #5
0
        public void AddPlayer(GameObject playerObject, PacketSession playerSession)
        {
            AddGameObject(playerObject);

            const int retryCount = 1024;
            if (!Enumerable.Range(0, retryCount).Any(_ => _sessions.TryAdd(playerSession, playerObject.ObjectId)))
                throw new InvalidOperationException();
        }
Example #6
0
 public void Dispatch(IPacket packet, PacketSession peerSession)
 {
     var packetType = packet.GetType();
     var pair = _handlerMap[packetType];
     pair.Value.Invoke(pair.Key, new object[] { packet, peerSession });
 }