1. 程式人生 > 其它 >自定義通訊協議傳輸protobuf

自定義通訊協議傳輸protobuf

自定義協議

本次我們使用的是datalength+databytes 的自定義長度的協議
datalength:就是後面databytes的長度
databytes:protobuf 3.0協議資料序列化後的資料內容,長度不限

操作流程

客戶端:將資料按照通訊協議封裝,推送給服務端
服務端:服務端接收到資料後,按照協議解析出資料

服務端程式碼Demo

public class ServerTestService {
	private static Socket client;
    private static void listen() {
        try {
            DataInputStream dis =
new DataInputStream(client.getInputStream()); DataOutputStream dos = new DataOutputStream(client.getOutputStream()); int i= 0; while (true) { i++; int length = dis.readInt(); byte[] message = new byte[length]; dis.
readFully(message); ImScrmWwProto.TransportMessage transportMessage = ImScrmWwProto.TransportMessage.parseFrom(message); System.out.println("服務端[" + i + "]接收:length: " + length + " message: "+transportMessage); dos.writeInt
(length); dos.write(message); dos.flush(); } } catch (IOException e) { e.printStackTrace(); } } @SneakyThrows public static void main(String[] args) { ServerSocket serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress("127.0.0.1", 8090)); client = serverSocket.accept(); listen(); } }

客戶端程式碼

public class ClientMessageService {
 private static Socket socket;

    public static void main(String[] args) {
        try {
            socket = new Socket("127.0.0.1",8090);
            SendMessageRequest request = SendMessageRequest.builder()
                    .id(1)
                    .accessToken("accessToken11111111111")
                    .messageType(1001)
                    .requestMessageId(1222222)
                    .content("any object")
                    .build();
            send(request);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void send(SendMessageRequest request) {

        ImScrmWwProto.TransportMessage.Builder transportMessageBuild = ImScrmWwProto.TransportMessage.newBuilder();
        transportMessageBuild.setId(request.getId());
        transportMessageBuild.setAccessToken(request.getAccessToken());
        transportMessageBuild.setMsgType(MessageTypeConverter.of(request.getMessageType()));
        transportMessageBuild.setRefMessageId(request.getRequestMessageId());
        transportMessageBuild.setContent(Any.pack(transportMessageBuild.build()));

        ImScrmWwProto.TransportMessage transportMessage = transportMessageBuild.build();
        byte[] payload = transportMessage.toByteArray();
        try {
            int i = 0;
            while (true) {
                i++;
                System.out.println("客戶端["+i + "]傳送 length:" + payload.length + " message: " + transportMessage);
                DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                dos.writeInt(payload.length);
                dos.write(payload);
                dos.flush();
                Thread.sleep(10000);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

執行結果

客戶端傳送
服務端接收