Пример #1
0
        public void TestMultiplePacket()
        {
            var codec = new PacketCodec();

            var a = new ConnectPacket();
            var b = new DisconnectPacket();

            var stream = new MemoryStream();
            var writer = new BinaryWriter(stream);
            var data   = ByteJoin.Combine(codec.Encode(a), codec.Encode(b));

            var reader = new BinaryReader(new MemoryStream(data));
            var iter   = new PacketEnumerator(reader);

            // 1st packet
            {
                Assert.True(iter.MoveNext());
                ConnectPacket p;
                Assert.True(iter.GetCurrent(out p));
                Assert.Equal(a, p);
            }

            // 2nd packet
            {
                Assert.True(iter.MoveNext());
                DisconnectPacket p;
                Assert.True(iter.GetCurrent(out p));
                Assert.Equal(b, p);
            }

            // end of stream
            {
                Assert.False(iter.MoveNext());
            }
        }
Пример #2
0
        public void SendImmediate <T>(T p) where T : IPacket
        {
            var bytes = codec.Encode(p);

            ws.Send(bytes);

            var now = TimeUtils.NowTimestamp;

            bandwidth.AddSent(bytes.Length, now);
        }
Пример #3
0
        public bool SendImmediate <T>(T p) where T : IPacket
        {
            if (State != SessionState.Connected)
            {
                return(false);
            }
            var bytes = codec.Encode(p);

            transport.Send(bytes);
            return(true);
        }
Пример #4
0
        void HandleDisconnect(Session session, DisconnectPacket p)
        {
            if (session.State == SessionState.Disconnected)
            {
                log.Info($"already disconnected: id={session.ID}");
                return;
            }

            // 연결 종료는 소켓이 끊어질떄도 있고
            // 유저가 직접 종료시키는 경우도 있다
            // disconnect를 여러번 호출해도 꺠지지 않도록 하자
            // 연결 끊은것을 연결 종료 패킷처럼 다루면
            // 상위 레이어에서의 처리가 간단해진다
            if (session.WorldID != null)
            {
                var leave = new WorldLeavePacket();
                var codec = new PacketCodec();
                var bytes = codec.Encode(leave);
                var pair  = new ReceivedPacket <WorldLeavePacket>(session, bytes);
                HandleWorldLeave(session, pair);
            }

            log.Info($"disconnect: id={session.ID}");
            var disconnect = new DisconnectPacket();

            session.SendLazy(disconnect);

            // 연결 끊어도 된다는 표시 해두기. 언제 끊어도 상관 없어야한다
            NetworkStack.Session.CloseSessionActive(session);
        }
Пример #5
0
        protected override void OnClose(CloseEventArgs e)
        {
            log.Info($"OnClose: code={e.Code}, reason={e.Reason}, wasClean={e.WasClean}");

            // 소켓이 닫히는건 아래쪽 레이어에서 감지한다
            // 상위레이어로 소켓이 닫혔다는걸 알려주기
            var p     = new DisconnectPacket();
            var codec = new PacketCodec();

            transport.Recv(codec.Encode(p));

            NetworkStack.Session.CloseSessionPassive(session);
            session = null;
        }
Пример #6
0
        public void TestEncodeDecode()
        {
            var codec = new PacketCodec();

            var a      = new WelcomePacket(12, 34);
            var stream = new MemoryStream();
            var writer = new BinaryWriter(stream);
            var data   = codec.Encode(a);

            var           reader = new BinaryReader(new MemoryStream(data));
            var           type   = codec.ReadPacketType(reader);
            WelcomePacket b;
            var           ok = codec.TryDecode(type, reader, out b);

            Assert.True(ok);
            Assert.Equal(a, b);
        }
Пример #7
0
        public void TestSinglePacket()
        {
            var codec  = new PacketCodec();
            var a      = new ConnectPacket();
            var stream = new MemoryStream();
            var writer = new BinaryWriter(stream);
            var data   = codec.Encode(a);

            var reader = new BinaryReader(new MemoryStream(data));
            var iter   = new PacketEnumerator(reader);

            Assert.True(iter.MoveNext());
            Assert.Equal((short)a.Type, iter.CurrentType);
            ConnectPacket p;

            Assert.True(iter.GetCurrent(out p));
            Assert.Equal(a, p);
        }
Пример #8
0
        public void Send <T>(T p) where T : IPacket
        {
            var data = codec.Encode(p);

            ws.Send(data);
        }