1. 简单介绍
  2. 创建Message的方式
  3. 创建Sender和发送消息
  4. 创建Recver和接收消息

包含简单的Message介绍

Message创建方式

Sender的创建和发送数据包的方式

Recver的创建和接收数据包的方式

简单介绍

不同的具体业务Message通过TopicType一起进行区分。

Topic - 位于EntinyTopicConst文件中,添加自己定义的Topic常量

是消息订阅的基本单位,消息订阅的时候只能够订阅一个Topic下的所有消息

Type - 位于EntinyTypeConst,添加自己定义的Type常量

由于一个Topic下存在多种消息,所以还需要进行具体的区分。

如Topic代表账号信息,则Type将可能存在登录消息,注册消息,注销消息。订阅的时候只能订阅账号信息,其中包含登录注册注销的消息。

创建Message的方式

Message作为的具体的消息数据包

根据上文知道了创建Message需要通过Topic和Type进行区分。

这里以登录消息的创建为例。

  1. 添加常量。首先在EntinyTopicConst和EntinyTypeConst中定义消息的常量,这里创建了一个账号信息的Topic和登录信息的Type。EntinyTopicConst不能出现重复的值,EntinyTypeConst也不能出现重复的值
public interface EntinyTopicConst {
Integer defaultMessage = 0;
Integer accountMessage = 100;
}

public interface EntinyTypeConst {
Integer defaultMessage = 0;
Integer loginMessage = 1;
}
  1. 创建AccountMessage类。继承自基本的MessageBase类。只需要实现两个接口即可

getTopicId返回设置好的Topic常量,而此时getTypeId没有具体的Type所以设置默认类型

public class AccountMessage extends MessageBase {
AccountMessage() {

}
@Override
public Integer getTopicId() {
return EntinyTopicConst.accountMessage;
}
@Override
public Integer getTypeId() {
return EntinyTypeConst.defaultMessage;
}
}
  1. 创建LoginMessage类。继承自AccountMessage。

这里需要一个static代码块进行注册,以及重写getTypeId返回具体的Type信息

注册的时候调用方式如下。MessageBase.RegisterType函数

参数1:Topic常量 EntinyTopicConst.accountMessage

参数2:Type常量 EntinyTypeConst.loginMessage

参数3:Topic和Type定位到的具体的class,也就是下面的LoginMessage.class

public class LoginMessage extends AccountMessage {

static
{
MessageBase.RegisterType(EntinyTopicConst.accountMessage,
EntinyTypeConst.loginMessage, LoginMessage.class);
}
@Override
public Integer getTypeId() {
return EntinyTypeConst.loginMessage;
}
// 下面是具体的消息字段,传统的构造函数和get set 方便序列化和反序列化
// IDEA一键生成即可
private String username;
private String password;

public LoginMessage(){
}
public LoginMessage(String username, String password) {

this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}

创建Sender和发送消息

Sender作为数据包的发送者。

1. 首先创建一个Sender

@param connectionName 连接的名称 用于日志打印
@param ip 服务器的ip
@param port 服务器的端口号
Sender sender = new Sender("AccountConnection","47.100.137.123", 9999);

2-1. 不使用回调初始化

初始化Sender,初始化的时候会对服务器进行连接

sender.init();

使用isConnected判断服务器是否连接成功

while (!sender.isConnected()) {
Thread.sleep(100);
}

2-2. 使用回调初始化

连接成功后自动执行onConnectSuccess函数,sender即为连接成功的sender

sender.init(new OnConnectionCallback() {
@Override
public void onConnectSuccess(Sender sender) {

}
});

此时isConnected同样可以使用

3. 发送消息。

按照上面的方式创建完数据包后,只需要简单的new一个数据包 填写完自己需要的字段后 直接send即可

LoginMessage messageSend = new LoginMessage();
messageSend.setUsername("username");
messageSend.setPassword("password");
sender.send(messageSend);

创建Recver和接收消息

1. 创建Recver,相对Sender多了一个订阅的Topic消息类型

@param connectionName 连接的名称
@param subscribeTopic 订阅的Topic
@param ip 服务器的ip
@param port 服务器的端口号
Recver recver = new Recver("AccountConnection", EntinyTopicConst.accountMessage,
"47.100.137.123", 9999);

2. 先设置消息到来的回调函数

由于一个Topic下面存在多种具体的消息类型。

所以需要通过getTypeId获取具体的消息类型,然后进行强转得到具体的Message类

recver.setOnMessageCallback(new OnMessageCallback() {
@Override
public void onNewMessage(MessageBase message) {
if (message.getTypeId().equals(EntinyTypeConst.loginMessage)) {
LoginMessage loginMessage = (LoginMessage) message;
System.out.println(loginMessage.getUsername());
}
}
});

3. 初始化并连接服务器

recver.init();

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。