这期我们来分析下消息头+消息体的这种方式来实现完美的解决方案,当然这也是最复杂的一种实现,因为在大多数场景中,性能和复杂度始终不能兼得。代码中使用了MessagePack的第三方序列化,因为我们要传输的实体类对象在客户端和服务端之间要经过序列化和反序列化
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>msgpack</artifactId>
<version>0.6.12</version>
</dependency>
1.实体类
package serializable.msgpack;
import org.msgpack.annotation.Message;
@Message // MessagePack提供的注解,表明这是一个需要序列化的实体类
public class User {
private String id;
private String userName;
private int age;
private UserContact userContact;
public User(String userName, int age, String id) {
this.userName = userName;
this.age = age;
this.id = id;
}
public User() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public UserContact getUserContact() {
return userContact;
}
public void setUserContact(UserContact userContact) {
this.userContact = userContact;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", userName='" + userName + '\'' +
", age=" + age +
", userContact=" + userContact +
'}';
}
}
package serializable.msgpack;
import org.msgpack.annotation.Message;
@Message // MessagePack提供的注解,表明这是一个需要序列化的实体类
public class UserContact {
private String mail;
private String phone;
public UserContact() {
}
public UserContact (String mail, String phone) {
this.mail = mail;
this.phone = phone;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "UserContact{" +
"mail='" + mail + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
2.Server
package serializable.msgpack;
import constant.Constant;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;