自定义实现客户端与服务器端通信协议

自定义实现客户端与服务器端通信协议

1 通信协议的设计

自定义的通信协议需要哪些内容

1)魔数:第一个字段一般是魔数,一般固定的几个字节。一个PNG图片的编码中有固定数量固定内容的字节,用于表示这是一个PNG图片;Java的Class文件打头有一串魔数用于表示这是一个class文件;同样,我们的通信协议也是这么定义,服务器端或客户端收到数据包之后,会先读取魔数看看是不是我们定义的通信协议,只有是我们的通信协议时才能按照我们定义的规则正确读取数据。

2)版本号:用于一个字节表示,比如Http协议有1.0/1.1/2.0版本,用于标识当前的数据包使用的是哪个版本号

3)序列化算法:我们Netty通信过程中,使用Java对象进行数据传输,就一定会涉及到序列化与反序列化,用一个字节说明采用哪种序列化方式。

4)指令:你发给我这个数据包时要干什么。比如TCP协议中,SYN位置1就代表我是要跟你建立连接、FIN位置1就是代表我要断开连接。在聊天系统中,服务器收到客户端的数据包,指令位用于说明客户端发送这条数据包的目的,是要给某人发送消息呢还是要添加某人为好友呢还是怎么的…

5)数据长度:我发送给你的数据包的数据部分的长度是多少。解决TCP粘包拆包问题

6)数据部分:传输的数据

image-20200729102904574

2 通信协议的实现

2.1 Java对象

1)定义通信过程中传输的Java对象的抽象类

package maolaoke.top.netty.protocol;

import lombok.Data;

@Data
public abstract class Packet {
   
    //协议版本
    private Byte version = 1;

    //获取指令
    public abstract Byte getCommand();
}

2)~~定义一个枚举类,列出所有的指令。~~定义一个Command接口来模拟枚举,因为枚举默认是Integer类型,而我们要传输的是一个字节,用Byte来表示更合适。

public interface Command {
   
    Byte LOGIN_REQUEST = 1;  //表示这是一个登录请求
}

登录请求的Java类定义:

import maolaoke.top.netty.protocol.Command;

public class LoginRequestPacket  extends Packet{
   
    private Integer userId;

    private String username;

    private String password;
    
    @Override
    public Byte getCommand() {
   
        return Command.LOGIN_REQUEST;
    }
}

2.2 序列化

1)定义一个接口来模拟枚举,枚举所有的序列化标识。

public interface SerializerAlgorithm {
   
    byte JSON_SERIALIZER = 1;  //JSON序列化
}

2)定义一个序列化接口

public interface Serializer {
   
    //获取序列化方式
    byte getSerializerAlgorithm();

    //序列化方法
    byte[] serialize(Object object
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较复杂的问题,需要进行多方面的考虑和实现。我可以提供一些思路和步骤,但是具体实现还需要您进行详细的编码和调试。 1. 首先,需要设计好客户端服务器端之间的通信协议,包括消息类型、消息格式、消息长度等等。可以使用自定义协议或者使用现有的协议,比如JSON、XML等。 2. 然后,需要实现客户端服务器端之间的网络通信,可以使用TCP协议进行连接和数据传输。在客户端服务器端分别创建一个socket,并进行连接。 3. 实现并发服务器,可以使用多线程或者多进程的方式来实现。在服务器端使用一个主线程来监听客户端的连接请求,当有新的客户端连接时,可以开启一个新的线程或进程来处理客户端的请求。 4. 实现局域网内不同设备之间的互相聊天,需要使用设备的IP地址和端口号进行连接。可以在客户端手动输入服务器端的IP地址和端口号,也可以通过广播方式自动发现服务器端的IP地址和端口号。 5. 最后,需要实现客户端服务器端之间的数据传输和消息处理。客户端可以向服务器端发送消息,服务器端接收到消息后进行处理,并将消息发送给所有连接的客户端客户端接收到消息后进行展示。 总的来说,实现TCP聊天室需要的关键技术点包括网络通信、并发编程、数据传输和消息处理等。希望这些思路和步骤对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值