网游无外乎是所有客户端与服务器产生连接,当客户端1发生什么操作时,需要向服务端发送信息,此时服务端也会回复响应信息,客户端在根据响应信息做出功能。比如客户端1要创建角色,发信息给服务端,服务端就会把响应信息发给每个客户端。这样每个客户端都可以看到客户端1创建的角色。
网络通信的实现:
vs系统中底层提供了socket接口,用于实现网络通信,但是需要手动处理很多细节,开发效率较低,所以往往会引入HPSocket,这是基于socket而封装的一种可快速开发的网络通信框架。支持多种协议,比如:tcp,http等。
-
TCP 示例:
-
服务端:
new TcpServer()
-
客户端:
new TcpClient()
-
- HTTP 示例:
-
客户端:
new HttpClient()
-
服务端:
new HttpServer()
-
开发流程:
备注资料:
消息的组成:最简单的消息组成就是由类型、命令、参数组成。比如一个账号注册登录,客户端发送的注册消息组成(1,1,账号,密码)即类型1代表是账户类型,命令1代表注册。登录消息组成(1,2,账号,密码)即类型1代表是账户类型,命令2代表登录,参数就是账号密码。
①服务器的开发
引入HPScoket.Net包。
服务端主要流程:
创建服务器:server
public class Server
{
//创建服务器对象。
public static TcpServer server=new TcpServer();
//提供服务器的具体信息
public Sever()
{
//ip地址,服务端的ip地址
server.Address = "10.8.193.245";
//服务端监听的端口,这个可以随意,但是客户端连接端口也要是这个才能监听到。
server.Port = Convert.ToUInt16(5566);
//监听到客户端连接,订阅客户端连接事件。
server.OnAccept += Server_OnAccept;
//监听到客户端断开,订阅断开事件
server.OnClose += Server_OnClose;
//监听到客户端发来的消息,订阅接收到消息事件
server.OnReceive += Server_OnReceive;
//启动
server.Start();
}
}
分发接收消息:这里就有两种方式实现①搭建三层框架②消息监听模式
第一种:就是对于不同的类型消息会有不同的处理,比如账户类,我们就创建AccountBLL类业务逻辑层,专门用来处理账户类型消息。还有角色类,我们就创建UserBLL类业务逻辑层来处理角色类型的消息。还会创建对应的AccountDAL类,UserDAL。数据访问层就是往往需要与数据库直接对接,将数据返回给业务逻辑层。
第二种:大致原理一样,只是不用创建三层,当接收到消息时,直接执行每个监听对象的onreceive方法,每个监听对象的onreceive方法中都会有if(type==??)判断只有是那种类型的消息才会执行。
服务器接收到消息处理程序:
private HandleResult Server_OnReceive(IServer sender, IntPtr connId, byte[] data)
{ //分发接收消息
//把二进制转换成message
Message message = MessageTool.ToObject(data);
//判断是什么类型,因为不同的类型执行不同的逻辑。
switch (message.type)
{
case Message.Type.Type_Account ://说明是账号类型
BLLManager.Instance.account.Server_OnReceive(connId, message);//执行accountbll业务逻辑层的onreceive方法
break;
case Message.Type.Type_User://说明是账号类型
BLLManager.Instance.user.Server_OnReceive(connId, message);
break;
case Message.Type.Type_Game:
BLLManager.Instance.game.Server_OnReceive(connId, message);
break;
}
return HandleResult.Ok;
}
每个业务逻辑层都有自己的onreceive方法,所以适合创建一个接口,继承接口即可。同时还会创建模型层,比如有账户模型类,里面的基本信息就是id,账号,密码。注册账户就是要创建一个账户模型类对象,还有角色模型类,里面的基本信息有id,血量,位置,那个类型的角色等,创建一个角色就是要创建一个角色模型信息对象。
客户端主要流程:
首先同样需要引入需要的依赖项:
前两个是实现网络通信必备的程序集,NetModel其实是我们在服务端封装号的,里面有messager类,是对一个信息的封装。
创建客户端:client
public class Client : MonoBehaviour
{
public static Client Instance;
//创建客户端对象
TcpClient tcpClient=new TcpClient();
void Start()
{
}
private void Awake()
{
Instance = this;
tcpClient.Address= "10.8.193.245"; //连接的服务端的ip地址
tcpClient.Port = Convert.ToUInt16(5566);//连接的端口号
tcpClient.Connect();//连接服务端
tcpClient.OnReceive += TcpClient_OnReceive1;
}
分发接收消息