创建应用层接口
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;
}
}
}
}
有需要学习视频的欢迎关注微信公众号