精华内容
下载资源
问答
  • 今天来记录一下用Java实现protobuf+GRPC实现数据传输。 概念性的内容就不在这里说了,直接上代码。 1.项目依赖,添加了依赖之后才能通过.proto文件进行生成grpc代码。 <parent> <groupId>org....

    今天来记录一下用Java实现protobuf+GRPC实现数据传输。

    概念性的内容就不在这里说了,直接上代码。

    1.项目依赖,添加了依赖之后才能通过.proto文件进行生成grpc代码。

    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.11.RELEASE</version>
            <relativePath/>
        </parent>
    
        <groupId>org.example</groupId>
        <artifactId>grpc</artifactId>
        <version>1.0-SNAPSHOT</version>
    
    
    
        <dependencies>
    
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>3.5.1</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-all</artifactId>
                <version>1.12.0</version>
            </dependency>
    
        </dependencies>
    
    
    
        <build>
            <extensions>
                <extension>
                    <groupId>kr.motd.maven</groupId>
                    <artifactId>os-maven-plugin</artifactId>
                    <version>1.4.1.Final</version>
                </extension>
            </extensions>
            <plugins>
                <plugin>
                    <groupId>org.xolstice.maven.plugins</groupId>
                    <artifactId>protobuf-maven-plugin</artifactId>
                    <version>0.5.0</version>
                    <configuration>
                        <protocArtifact>com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier}</protocArtifact>
                        <pluginId>grpc-java</pluginId>
                        <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.0:exe:${os.detected.classifier}</pluginArtifact>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>compile</goal>
                                <goal>compile-custom</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <!--<plugin>-->
                <!--<groupId>org.springframework.boot</groupId>-->
                <!--<artifactId>spring-boot-maven-plugin</artifactId>-->
                <!--</plugin>-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                        <compilerVersion>${java.version}</compilerVersion>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </build>

    2.需要有一个.proto文件用来定义数据格式和传输方法

    syntax = "proto3";
    
    option java_multiple_files = true;
    option java_package = "com.yueyue.grpc";
    option java_outer_classname = "TestProto";
    option objc_class_prefix = "WY";
    
    package onlytest;
    
    //定义服务
    service TestGreeter {
      //注意:这里是returns 不是return
      rpc TestSomeThing (TestRequest) returns (TestResponse) {
      }
    }
    //定义消息类型
    message TestRequest {
      string name = 1;
      string age = 20;
    }
    message TestResponse {
      string message = 1;
    }

    3.执行maven -compile 命令,博主这里是在idea中执行的

    4.服务端代码,通过main方法直接启动。

    package com.yueyue.test.protobuf.server;
    
    import com.yueyue.grpc.TestGreeterGrpc;
    import com.yueyue.grpc.TestRequest;
    import com.yueyue.grpc.TestResponse;
    import io.grpc.Server;
    import io.grpc.ServerBuilder;
    import io.grpc.stub.StreamObserver;
    
    
    import java.io.IOException;
    
    /**
     * 服务端
     */
    
    public class TestServer {
        //定义端口
        private final int port = 50051;
        //服务
        private Server server;
    
        //启动服务,并且接受请求
        private void start() throws IOException {
            server = ServerBuilder.forPort(port)
                    .addService(new GreeterImpl())
                    .addService(new GreeterImpl())
                    .build().start();
    
            System.out.println("服务开始启动-------");
            Runtime.getRuntime().addShutdownHook(new Thread() {
                @Override
                public void run() {
                    System.err.println("------关闭服务-------");
                    TestServer.this.stop();
                    System.err.println("------服务关闭------");
                }
            });
        }
    
        //stop服务
        private void stop() {
            if (server != null) {
                server.shutdown();
            }
        }
        //server阻塞到程序退出
        private void  blockUntilShutdown() throws InterruptedException {
            if (server!=null){
                server.awaitTermination();
            }
        }
    
        //实现服务接口的类
        private class GreeterImpl extends TestGreeterGrpc.TestGreeterImplBase {
            public void testSomeThing(TestRequest request, StreamObserver<TestResponse> responseObserver) {
    
                System.out.println("接收到数据:" +request );
    
                TestResponse build = TestResponse.newBuilder().setMessage(request.getName()).build();
                //onNext()方法向客户端返回结果
                responseObserver.onNext(build);
                //告诉客户端这次调用已经完成
                responseObserver.onCompleted();
            }
        }
    
    
    
        public static void main(String[] args) throws IOException, InterruptedException {
            final  TestServer server=new TestServer();
            server.start();
            server.blockUntilShutdown();
        }
    }

     5.客户端代码

    package com.yueyue.test.protobuf.client;
    
    
    import com.yueyue.grpc.TestGreeterGrpc;
    import com.yueyue.grpc.TestRequest;
    import com.yueyue.grpc.TestResponse;
    import io.grpc.ManagedChannel;
    import io.grpc.ManagedChannelBuilder;
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * 客户端
     */
    public class TestClient {
        private final ManagedChannel channel;
        private final TestGreeterGrpc.TestGreeterBlockingStub blockingStub;
        private static final String host = "127.0.0.1";
        private static final int ip = 50051;
    
        public TestClient(String host, int port) {
            //usePlaintext表示明文传输,否则需要配置ssl
            //channel  表示通信通道
            channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext(true).build();
            //存根
            blockingStub = TestGreeterGrpc.newBlockingStub(channel);
        }
    
        public void shutdown() throws InterruptedException {
            channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
        }
    
        public void testResult(String name) {
            TestRequest request = TestRequest.newBuilder().setName(name).build();
            TestResponse response = blockingStub.testSomeThing(request);
            System.out.println("接收到返回值:"+response.getMessage());
        }
    
        public static void main(String[] args) {
            TestClient client = new TestClient(host, ip);
            for (int i = 0; i < 5; i++) {
                client.testResult("数据" + i);
            }
        }
    }

     6.测试,先启动server,再启动客户端代码。

     

     搞定!

     博主已经将代码上传到gitee上了 ,博友们可以自行下载,这么良心的博主已经很少见了!

    代码git地址:https://gitee.com/840312696/protobuf-grpc.git

    展开全文
  • protobuf序列化实例(Java实现

    千次阅读 2019-07-05 13:09:34
    这里介绍如何通过protobufjava中做序列化。首先,我们需要准备protoc编译环境,这个是前提,我们写好了proto文件,当然需要生成对应的java类,这时候,就需要protoc-2.x.x-win32工具将其转为java类。这里我使用的...

    protobuf是google开源的序列化工具,他支持很多语言。这里介绍如何通过protobuf在java中做序列化。首先,我们需要准备protoc编译环境,这个是前提,我们写好了proto文件,当然需要生成对应的java类,这时候,就需要protoc-2.x.x-win32工具将其转为java类。这里我使用的是protoc-2.4.1-win32工具,这个在网上可以下载,下载之后,解压到本地,然后将/path/to/protoc路径加入环境变量的path变量中,这样,我们可以在命令行下运行protoc命令了。如下所示:

    准备一个User.proto文件,内容如下,我们定一个User类,下面有4个属性,分别是id,name,age,mobile。

    option java_outer_classname="UserProtoBuf";
    option java_package="com.xxx.serial";
    message User{
    	required int32 id=1;
    	required string name=2;
    	optional int32 age=3;
    	optional string mobile=4;
    }

    虽然语法和java有些区别,而且数据类型也不太一样,但是基本能够看得懂这个proto文件表示的含义。它指定了生成的java类名和对应的包名package,使用message关键字定义了User对象,最后定义了四个属性字段。 

    我们在命令行下通过如下命令,就可以生成一个Java类了:

    E:\javaworkspace\javaee\src\main\java>protoc --java_out=. com\xxx\serial\User.proto

    没有任何报错,那么生成的文件就是UserProtoBuf.java,截图如下:

    接下来,我们需要在maven工程中加入protobuf-java依赖,我们要使用protoc创建的java类,必须要加入protobuf-java这个依赖。

    <dependency>
      <groupId>com.google.protobuf</groupId>
      <artifactId>protobuf-java</artifactId>
      <version>2.6.1</version>
    </dependency>

     最后,我们就通过一个测试类来使用我们序列化之后的UserProtoBuf类。

    package com.xxx.serial;
    
    import com.xxx.serial.UserProtoBuf.User;
    
    public class UserProtoMain {
    
    	public static void main(String[] args) {
    		UserProtoBuf.User.Builder builder = UserProtoBuf.User.newBuilder();
    		builder.setId(1);
    		builder.setName("protoc-java");
    		builder.setAge(18);
    		builder.setMobile("15011186302");
    		User user = builder.build();
    		System.out.println(user.toString());
    	}
    
    }
    

    运行之后,打印信息如下:

     

    这篇文章,简单介绍了如何从proto文件到java文件,再到使用生成的java文件做序列化的过程。在实际应用中,protobuf的数据类型比这个还要多,序列化可能更复杂。 

    展开全文
  • protobuf java 接口 demo

    2019-12-31 17:09:10
    protobuf demo 接口当中使用protobuf 主要内容请查看博客https://blog.csdn.net/qq_21113625/article/details/103782738
  • Unity3D & Java 基于 Protobuf 通信实现,客户端代码
  • Socket + ProtoBuf

    2021-03-08 23:18:06
    跨平台 ProtoBuf支持多平台和语言, 包括C++/Java/Python等等 序列化&反序列号 ProtoBuf支持直接将对象序列化成Data, 也支持直接将Data序列化为对象类型 消息大小 一条消息数据,用protobuf序列化后的大小是json的10...

    TCP/UDP

    进行Socket编程, 常见使用的协议UDP/TCP

    TCP:传输控制协议 。是专门设计用于在不可靠的因特网上提供可靠的,端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。

    UDP:用户数据报协议 。不需要建立连接,不可靠。

    d1ba6adb3e64

    TCP连接过程.png

    d1ba6adb3e64

    UDP连接过程.png

    长连接和短连接

    长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。

    短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。

    通常的短连接操作步骤是:

    连接→数据传输→关闭连接或在没有数据传输时直接关闭;

    而长连接通常就是:

    连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;

    Socket框架

    BSD Socket

    BSD Socket 是UNIX系统中通用的网络接口,它不仅支持各种不同的网络类型,而且也是一种内部进程之间的通信机制。在我们iOS中也可以使用,但是它所有的函数都是基于C语言的,所有在实际的项目开发中,我们都是使用封装好的。

    CFSocket

    CFSocket是苹果官方提供给我们进行Socket编程,里面还是有很多C语言的东西,大家有时间可以研究一下,在实际项目中,通常我们不会自己直接使用。

    AsyncSocket

    AsyncSocket是一个开源的库,用来进行iOS的Socket编程就非常方便, 但是目前只有OC版本, 并且长时间没有更新

    ysocket

    目前使用Swift进行Socket编程时,常用的一个库

    消息数据类型

    直接传递C/C++语言中一字节对齐的结构体数据,只要结构体的声明为定长格式,那么该方式对于C/C++程序而言就非常方便了, 但是对于java这种不常用结构体的语言, 处理起来就相当麻烦

    使用SOAP协议(WebService)作为消息报文的格式载体,由该方式生成的报文是基于文本格式的,同时还存在大量的XML描述信息,因此将会大大增加网络IO的负担。又由于XML解析的复杂性,这也会大幅降低报文解析的性能。总之,使用该设计方式将会使系统的整体运行性能明显下降。

    Json交换格式, 目前比较理想的一种通信格式, 也是在Http请求数据时, 最常见的用法(Demo程序)

    ProtocolBuffer(也称PB/GPB): google 的一种数据交换的格式, 可以实现跨平台, 方便的序列化&反序列化, 并且数据量相对json

    ProtocolBuffer

    1、简介

    跨平台

    ProtoBuf支持多平台和语言, 包括C++/Java/Python等等

    序列化&反序列号

    ProtoBuf支持直接将对象序列化成Data, 也支持直接将Data序列化为对象类型

    消息大小

    一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一

    2、安装Protobuf编译器

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

    brew install automake

    brew install libtool

    brew install protobuf

    git clone git@github.com:alexeyxo/protobuf-swift.git

    // cd protobuf-swift,反正一定要到scripts的父文件夹位置

    ./scripts/build.sh

    Add ./src/ProtocolBuffers/ProtocolBuffers.xcodeproj in your project.

    或使用Cocoapod:pod 'ProtocolBuffers-Swift'

    注意:Mac项目貌似不能直接使用cocoapods集成

    详情请看:https://github.com/alexeyxo/protobuf-swift

    3、编码xxx.proto文件,并生成对应的swift代码

    protoc xxx.proto --swift_out="./"

    如果前面在终端没有成功执行./scripts/build.sh,该句将报错。

    实际开发中的异同

    心跳包

    心跳包是什么呢?我们首先要弄清楚,我们每一个客户端连接到服务器之后,服务器会怎么来处理我们的连接。

    我们知道每一个客户端在连接到服务器的时候,都会有一个单独的线程来处理。比如我们前面给大家看的那个房间的例子,一个房间2000人,那就要有2000个连接保持。这对服务器的负荷是非常大的,但是如果说客户端断开了,服务器还保持着这个线程,就非常的耗资源。

    数据我们和服务器沟通的时候究竟发送什么数据?

    在实际开发中,我们不可能仅仅简单的给服务器发一个字符串,服务器给我们回一个字符串,这是不现实的。

    下面将使用ysocket、protocolbuffer实现一个简单的IM项目。

    基本环境搭建

    创建一个iOS工程作为客户端-Client,创建一个mac工程作为服务器-Server

    集成SwiftSocket、ProtocolBuffers-Swift

    编写IM.proto,并生成IM.proto.swift

    IM编程

    d1ba6adb3e64

    TCP连接过程.png

    客户端

    创建clientSocket;

    连接服务器;

    读取服务器可能发来的信息,即不断读取。而且读取信息是阻塞式的,两方面考虑都需要另开线程。代码之后再补充;

    发送信息给服务器。代码之后再补充

    import SwiftSocket

    class ViewController: UIViewController {

    var client: TCPClient = TCPClient(address: "127.0.0.1", port: 7878)

    var isConnected: Bool = false

    override func viewDidLoad() {

    super.viewDidLoad()

    switch client.connect(timeout: 10) {

    case .success:

    isConnected = true

    self.readServerMsg()

    case .failure(let error):

    print("连接服务器失败:\(error.localizedDescription)")

    }

    }

    // 读取服务器发送来的信息

    func readServerMsg() {

    DispatchQueue.global().async {

    while self.isConnected {

    }

    }

    }

    // 发送信息给服务器

    override func touchesBegan(_ touches: Set, with event: UIEvent?) {

    }

    }

    服务器

    创建serverSocket;

    创建clientSocket数组。数组的元素与客户端的clientSocket一一对应,并相互交流;

    serverSocket开启监听;

    不断接收客户端的clientSocket,并生成对应的clientSocket。需要另开线程;

    clientSocket不断读取客户端的clientSocket发来的信息。需要另开线程。代码之后再补充

    import SwiftSocket

    class ViewController: NSViewController {

    var server: TCPServer = TCPServer(address: "127.0.0.1", port: 7878)

    var clients: [TCPClient] = [TCPClient]()

    var serverRunning: Bool = false

    override func viewDidLoad() {

    super.viewDidLoad()

    switch server.listen() {

    case .success:

    serverRunning = true

    print("服务器已启动...")

    DispatchQueue.global().async {

    while self.serverRunning {

    if let client = self.server.accept() {

    print("服务器接收到客户端: \(client.address)")

    self.readClientMsg(client)

    }

    }

    }

    case .failure(let error):

    print("服务器监听失败:\(error.localizedDescription)")

    }

    }

    func stopRun() {

    serverRunning = false

    }

    // 读取服务器发送来的信息

    func readClientMsg(_ client: TCPClient) {

    clients.append(client)

    DispatchQueue.global().async {

    while self.serverRunning {

    }

    }

    }

    }

    此时代码基本完成,也可以运行看到基本效果。只是客户端与服务端都缺少发送与接收信息的代码。

    发送与接收 .protocolbuffer 数据

    1、创建 IM.proto 文件,生成 swift 源码文件。将源码文件分别添加到客户端程序(Client)与服务器(Server)中。

    syntax = "proto2";

    message UserInfo {

    required string name = 1;

    required int64 level = 2;

    required string iconUrl = 3;

    }

    2、补充之前,客户端与服务端发送与接收数据的代码

    客户端发送信息给服务器

    这里发送一个消息采用一次性发送的方式

    // 发送信息给服务器

    override func touchesBegan(_ touches: Set, with event: UIEvent?) {

    // 要发送的信息

    let userInfo = UserInfo.Builder()

    userInfo.name = "阿文\(arc4random_uniform(10))"

    userInfo.level = 20

    userInfo.iconUrl = "icon\(arc4random_uniform(5))"

    var data = (try! userInfo.build()).data()

    // 将消息长度添加进要发送的信息中

    var length = data.count

    data = data + Data(bytes: &length, count: 4)

    client.send(data: data)

    }

    服务器接收客户端发来的信息

    // 读取客户端发送来的信息

    func readClientMsg(_ client: TCPClient) {

    clients.append(client)

    DispatchQueue.global().async {

    while self.serverRunning {

    // 读取信息长度

    if let lengthBytes = client.read(4) {

    let lengthData = Data(bytes: lengthBytes, count: 4)

    var length = 0

    (lengthData as NSData).getBytes(&length, length: 4)

    // 读取信息

    if let dataBytes = client.read(length) {

    let data = Data(bytes: dataBytes, count: length)

    let userInfo = try! UserInfo.parseFrom(data: data)

    print("用户名:\(userInfo.name) 用户级别:\(userInfo.level)")

    client.send(data: lengthData + data)

    }

    }

    }

    }

    }

    客户端接收服务器发来的信息

    // 读取服务器发送来的信息

    func readServerMsg() {

    DispatchQueue.global().async {

    while self.isConnected {

    // 读取信息长度

    if let lengthBytes = self.client.read(4) {

    let lengthData = Data(bytes: lengthBytes, count: 4)

    var length = 0

    (lengthData as NSData).getBytes(&length, length: 4)

    // 读取信息

    if let dataBytes = self.client.read(length) {

    let data = Data(bytes: dataBytes, count: length)

    let userInfo = try! UserInfo.parseFrom(data: data)

    print("用户名:\(userInfo.name) 用户级别:\(userInfo.level)")

    }

    }

    }

    }

    }

    心跳包

    心跳包用于服务器检测客户端是否还在,其内在原理仍是客户端发送信息,服务器接收信息。不过心跳包信息必须表明独有的类型,所以发送一次信息除了信息长度与信息内容外,至少还包含一个标识符表明信息的类型。

    如果服务器在一定时间内检测不到客户端的心跳包,则断开该客户端的链接。

    展开全文
  • Protobuf协议--java实现

    2019-10-03 04:12:37
    Protobuf协议,全称:Protocol Buffer它跟JSON,XML一样,是一个规定好的数据传播格式。不过,它的序列化和反序列化...定义protobuf 文件,并使用protoc.exe 编译 为java文件。 protoc.exe 下载地址https://github.c...

    Protobuf协议,全称:Protocol Buffer 
    它跟JSON,XML一样,是一个规定好的数据传播格式。不过,它的序列化和反序列化的效率太变态了……

    来看看几张图你就知道它有多变态。 
    这里写图片描述

    这里写图片描述

    protobuf 协议 操作步骤:

    代码地址如下(注意:pom使用的依赖包,最好要与 protoc 一致。)

    https://files.cnblogs.com/files/z-test/protobuf-test.rar

    转载于:https://www.cnblogs.com/z-test/p/9330998.html

    展开全文
  • 问题背景是:线上有若干的C#的WCF服务需要调用,由于我们的应用是先切换的,在对方服务不改变的情况下,要能做到我们切换成java之后,能够实现访问的平滑过渡。其中一部分服务的请求有对应的.proto契约文件,利用pr....
  • 2. 选择proto.exe压缩包protoc-2.4-win32.zip和protobuf-java-2.4.1.jar压缩包protobuf-2.4.zip   3.下载一个protobuf-java-2.4.1.jar文件(注意,要与你刚才下的proto.exe版本相同,否则可能出现编译通不过...
  • java操作protobuf

    2021-03-04 08:24:57
    enum 在proto中定义的枚举类型,会生成java中的枚举类型: enum Gender{ male=1; femail=2; } public enum Gender implements com.google.protobuf.ProtocolMessageEnum { male(1), femail(2); ... private final ...
  • 上一篇博客中只讲解到了简单的使用protobuf,还不会的可以先去看一下【Android项目使用Protobuf教程(结合Retrofit+RxJava及HttpURLConnection使用)】,有位小伙伴问我如何使用泛型呢?比如每次网络请求都会有一些...
  • 一:protobuf编码基本数据类型public enumFieldType {DOUBLE (JavaType.DOUBLE , WIRETYPE_FIXED64 ),FLOAT (JavaType.FLOAT , WIRETYPE_FIXED32 ),INT64 (JavaType.LONG , WIRETYPE_VARI...
  • SpringBoot2.x整合Kafka实现消息中间件的发送及消费监听业务,其序列化方式采用ProtoBuf协议实现跨平台、跨语言的数据传输方式。
  • Java序列化和Protobuf

    2021-02-28 14:42:06
    这种情况在分布式用的比较多,类似的Xml和Json也可以实现这种效果;下面放一个Java序列化的例子1.创建实例化对象package com.bean;import java.io.Serializable;import java.util.List;/*** @author: jane* @...
  • 最近项目要接入某联盟广告,采用protobuf作为传输协议,以前没弄过,这次刚好使用到了,整理下一、环境准备:(mac下)1.1 下载protobuf2.5安装包http://pan.baidu.com/s/1o6v4Sae1.2 解压安装包tar-zxfprotobuf-2.5.0...
  • java protobuf 打印中文乱码问题

    千次阅读 2019-06-25 21:02:10
    对于一个protobuf对象,通过toString方法打印出来的中文是一串数字 如果想打印出中文可通过TextFormat.TextFormat.printToUnicodeString方法实现
  • 自己实现protobuf 压缩类,并能序列化反序列化
  • 最近一个项目中用到protobuf 并且使用了protobuf-java-format包将message对象转换成json串。但最后发现转换结果中值为0的字段全都不见了,排查了很久发现是protobuf-java包中的Message.getAllFields()方法不会返回与...
  • 上篇文章我们遗留了两个问题 1、protobuf 怎么运用到我们的项目当中?复杂的 List、Map、内嵌对象等等怎么实现? 2、protobuf 怎么和 JSON 互相...一、实现 Java 中 复杂的对象嵌套 二、protobuf 和 JSON 互相转换 ...
  • 就是把一个Java堆中存活的对象转换成一串二进制编码,然后该编码可以用于本地存储和网络传输。反序列化就是根据一串二进制编码还原出原来的那个对象,protobuf能够将一个对象以特定的格式转换为一个二进制串(序列化)...
  • java调用protobuf

    千次阅读 2014-07-19 11:26:41
    google 提供了三种语言的实现java、c++ 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构...
  • jprotobufA very useful utility library for java programmer using google protobufjprotobuf是针对Java程序开发一套简易类库,目的是简化java语言对protobuf类库的使用使用jprotobuf可以无需再去了解.proto文件...
  • 比如protobuf、thrift等等。服务发现。指服务提供者更新接口后,服务使用者如何知道该接口更新。Protobuf协议使用的是预编译方式,dubbo中使用的是zk作为媒介。负载均衡。流量控制、熔断。运维工具。常见RPC框架有...
  • idea中配合protobuf使用生成Java文件

    万次阅读 2019-03-13 15:04:18
    关于idea配置protobuf关于protobufGithub下载protobuf Compiler在idea里面配置protobuf Support在idea里面创建一个maven项目在idea里pom.xml配置相关依赖文件在src/main下创建一个==proto==包(一定要写正确格式...
  • protobuf 3.5 java使用介绍(一)

    万次阅读 多人点赞 2017-12-17 17:08:03
    protobuf 3.5 java使用介绍(一)网上大多的资料都是老版本的protobuf例子,正好用到了这个技术,我就把protobuf 3.5的使用方法记录一下,重点写了使用方法以及注意事项。proto描述文件的编写 语法 3.5的语法跟以前...
  • ProtobufJAVA

    2020-12-22 03:34:38
    因为TCP协议(UDP等这种低级协议)只能发送字节流,所以需要应用层将Java对象序列化成字节流,数据接收端再反序列化成Java对象即可。“序列化”一定会涉及到编码(encoding,format),目前我们可选择的编码方式:1)使用...
  • protobuf实现js与java间的http通信

    万次阅读 2016-08-23 22:28:38
    protobuf js java
  • protobuf亲测可用

    2018-08-24 14:26:50
    google 提供了三种语言的实现java、c++ 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构...
  • protobuf 3.5 java使用介绍(二)

    千次阅读 2021-02-17 15:44:13
    protobuf 3.5 java使用介绍(二) 上一篇遗留了两个问题: 1,数据模型中有可能会出现数组格式,而数组里面是一个其他的模型,这个怎么来做? 2,构建数据消息的时候,通常会有一个头,一个体;根据头中定义的数据...
  • 用Maven实现一个protobufJava例子

    千次阅读 2017-05-15 10:56:51
    最近需要用到protobuf协议,将json转化为protobuf,而事实上对protobuf完全不懂,所以参考了多篇文章先实际搭建一个例子看看,记录下过程。 1.首先去github上下载prtobuf-master.zip ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,299
精华内容 9,319
关键字:

java实现protobuf

java 订阅