Esempio n. 1
0
        public void Handle(TcpClient client)
        {
            DCLog.Log("connect a client ...");
            mChannel.Init(client);
            mChannel.AddListener(OnMsg);

            mChannel.StartReceive();
        }
Esempio n. 2
0
        public void Init(string host, int port)
        {
            DCLog.Log("server start ....");

            mTcpListener = new TcpListener(IPAddress.Parse(host), port);
            mTcpListener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            mTcpListener.Server.NoDelay = true;
            mTcpListener.Start();
        }
Esempio n. 3
0
        public async void Start()
        {
            DCLog.Log("server start accept ....");

            while (true)
            {
                if (mDisposed)
                {
                    return;
                }

                var tcpClient = await mTcpListener.AcceptTcpClientAsync();

                var clientHandler = new ClientHandler();
                clientHandler.SetServer(this);
                clientHandler.Handle(tcpClient);
            }
        }
Esempio n. 4
0
        public void OnMsg(Packet packet)
        {
            //首次连接第一个协议必须是user token

            var protoPacket = ProtoPacket.FromRecvBuf(packet.Bytes, 0, packet.Length);

            if (protoPacket.ProtoObj is PTestDemoClsReq req)
            {
                var f1 = req.F1;
                if (f1 == null)
                {
                    DCLog.Log("default is null");
                }
            }

            //echo to client
            mChannel.Send(
                SendBuf.From(Encoding.UTF8.GetBytes("echo ")),
                SendBuf.From(packet.Bytes, 0, packet.Length));
        }
Esempio n. 5
0
        public async void StartReceive()
        {
            /*
             * tcp 确保收到服务器下发的所有数据
             * 为了减少丢包导致的损失减少每次数据的发送量
             */

            /*
             * udp 不保证包一定送达 不保证顺序
             * 需要实现拼接
             */
            try
            {
                while (true)
                {
                    if (mDisposed)
                    {
                        return;
                    }

                    var stream = mClient.GetStream();
                    if (!stream.CanRead)
                    {
                        return;
                    }

                    var cnt = await mRecvBuf.WriteAsync(stream);

                    if (cnt == 0)
                    {
                        //SocketError.NetworkReset
                        //todo s send reconnect msg

                        return;
                    }

                    var suc = mPacketParser.Parse();
                    if (suc)
                    {
                        var packet = mPacketParser.GetPacket();
                        if (null != mOnRecvListener)
                        {
                            mOnRecvListener(packet);
                        }
                    }
                }
            }
            catch (IOException e)
            {
                DCLog.Err(e.Message);
                DCLog.Err(e.StackTrace);
            }
            catch (ObjectDisposedException e)
            {
                DCLog.Err(e.Message);
                DCLog.Err(e.StackTrace);
            }
            catch (Exception e)
            {
                DCLog.Err(e.Message);
                DCLog.Err(e.StackTrace);
            }
        }