Zjh游戏(四)应用层的实现

创建应用层接口

namespace MyServer
{
   public interface IApplication
    {
        void Disconnected(ClientPeer client);

        void Receive(ClientPeer client, NetMsg msg);
    }
}

Socket设置

  • 定义一个应用层
  • 定义一个设置应用层的方法,参数为应用层接口
  • 在客户端接受消息后的回调中,调用应用层中的接收方法
  • 在断开连接时,调用应用层中的断开连接方法
//定义和设置:
   		/// <summary>
        /// 应用层
        /// </summary>
        private IApplication application;
        /// <summary>
        /// 设置应用层
        /// </summary>
        public void SetApplication(IApplication application)
        {
            this.application = application;
        }
//调用:
//调用接收信息
  		/// <summary>
        /// 客户端处理消息完毕后的回调,发送到应用层
        /// </summary>
        private void ReceiveProcessCompleted(ClientPeer client, NetMsg msg)
        {

            //交给应用层处理
            application.Receive(client,msg);
        }
        
//调用断开连接的方法

		  //断开连接
        private void DisConnected(ClientPeer client, string reason)
        {
            try
            {
                if (client == null)
                {
                    throw new Exception("客户端为空,无法断开连接!");
                }
                Console.WriteLine(client.clientSocket.RemoteEndPoint + "客户端断开连接,原因:" + reason);
                application.Disconnected(client);
                //客户端自己处理断开连接
                client.DisConnected();

                clientPeerPool.Enqueue(client);//断开连接的Client放到客户端连接池中
                semaphore.Release();//释放一个Client
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }


添加一个类库,协议库

  • 创建一个文件夹,Code
  • 在Code中创建一个类OpCode类
  • 里面写模块对应的操作码
namespace Protocol.Code
{
    /// <summary>
    /// 操作码
    /// </summary>
    public class OpCode
    {
        /// <summary>
        /// 账号模块
        /// </summary>
        public const int Account = 0;
        /// <summary>
        /// 匹配模块
        /// </summary>
        public const int Match = 1;
        /// <summary>
        /// 聊天模块
        /// </summary>
        public const int Chat = 2;
        /// <summary>
        /// 战斗模块
        /// </summary>
        public const int Fight = 3;
    }
}

创建一个控制台应用

  • 创建一个类,NetMessageCenter消息处理中心
  • 添加MyServer的引用
  • 添加协议库的引用
  • 继承IApplication,实现接口中的方法
  • 在接收消息的方法中,遍历所有的操作码
using MyServer;
using Protocol.Code;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GameServer
{
    /// <summary>
    /// 消息处理中心
    /// </summary>
    public class NetMessageCenter : IApplication
    {
        public void Disconnected(ClientPeer client)
        {

        }

        public void Receive(ClientPeer client, NetMsg msg)
        {
            switch (msg.opCode)
            {
                case OpCode.Account:
                    break;
                case OpCode.Chat:
                    break;
                case OpCode.Match:
                    break;
                case OpCode.Fight:
                    break;
            }
        }
    }
}

有需要学习视频的欢迎关注微信公众号
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值