rpc跨平台通信的简单案例,java和go

这篇具有很好参考价值的文章主要介绍了rpc跨平台通信的简单案例,java和go。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当我们使用Go和Java进行RPC(Remote Procedure Call,远程过程调用)跨平台通信时,你可以使用gRPC作为通信框架。gRPC是一个高性能、开源的RPC框架,它支持多种编程语言,包括Go和Java。下面我将为你提供一个简单的案例来说明如何使用Go和Java进行RPC跨平台通信。

Go作为服务器端,Java作为客户端。

首先,你需要定义一个包含所需方法的.proto文件(Protocol Buffers文件),这个文件将用于生成Go和Java的RPC代码。假设你的.proto文件名为example.proto,内容如下:

syntax = "proto3";

package example;

service MyService {
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

接下来,你需要使用该.proto文件生成Go和Java的RPC代码。使用以下命令生成Go代码:

protoc --go_out=. example.proto

这将生成一个名为example.pb.go的Go文件。

然后,使用以下命令生成Java代码:

protoc --java_out=. example.proto

这将生成一个名为Example.java的Java文件。

现在我们来编写服务器端的Go代码(假设文件名为server.go):

package main

import (
	"context"
	"log"
	"net"

	"google.golang.org/grpc"

	pb "path/to/generated/go/package" // 替换为实际的Go生成代码包路径
)

type server struct{}

func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
	name := req.GetName()
	message := "Hello, " + name
	return &pb.HelloResponse{Message: message}, nil
}

func main() {
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	s := grpc.NewServer()
	pb.RegisterMyServiceServer(s, &server{})

	log.Println("Server started on port 50051")
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

确保将path/to/generated/go/package替换为实际的Go生成代码包的路径。

现在我们来编写客户端的Java代码:

import example.Example.MyService;
import example.Example.HelloRequest;
import example.Example.HelloResponse;

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

public class Client {
    public static void main(String[] args) {
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
                .usePlaintext()
                .build();

        MyService blockingStub = MyService.newBlockingStub(channel);

        HelloRequest request = HelloRequest.newBuilder()
                .setName("John")
                .build();

        HelloResponse response = blockingStub.sayHello(request);

        System.out.println("Response: " + response.getMessage());

        channel.shutdown();
    }
}

确保将example.Example替换为实际的Java生成代码的包名。

现在,你可以在终端中分别运行服务器端的Go代码和客户端的Java代码。服务器将在本地的50051端口上监听,并等待客户端的请求。客户端将连接到服务器,并向服务器发送一个带有名字的请求。服务器将返回一个包含问候消息的响应,并在客户端上打印该消息。

这就是使用Go和Java进行RPC跨平台通信的简单示例。你可以根据自己的需求扩展和修改代码。记得在实际使用时,替换相应的包路径和端口号来适应你的环境。

go做客户端,java做服务端的案例

使用Java作为服务端,Go作为客户端进行RPC跨平台通信

Java服务端代码

首先,我们从Java服务端开始。在这个案例中,我们将使用Java和gRPC构建一个简单的服务端,它提供一个名为GreetingService的RPC服务,客户端可以调用该服务来获取问候消息。

  1. 创建一个名为GreetingService.proto的Protocol Buffers文件,定义了服务和消息的结构。
syntax = "proto3";

package example;

service GreetingService {
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}
  1. 使用gRPC的插件生成Java代码。
protoc --java_out=. GreetingService.proto
  1. 创建一个名为GreetingServiceImpl.java的Java类,实现GreetingService接口。
package example;

import io.grpc.stub.StreamObserver;

public class GreetingServiceImpl extends GreetingServiceGrpc.GreetingServiceImplBase {
    @Override
    public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
        String name = request.getName();
        String message = "Hello, " + name;
        HelloResponse response = HelloResponse.newBuilder().setMessage(message).build();
        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }
}
  1. 创建一个名为Server.java的Java类,启动gRPC服务端。
package example;

import io.grpc.Server;
import io.grpc.ServerBuilder;
import java.io.IOException;

public class Server {
    private final int port;
    private final Server server;

    public Server(int port) throws IOException {
        this.port = port;
        this.server = ServerBuilder.forPort(port)
                .addService(new GreetingServiceImpl())
                .build();
    }

    public void start() throws IOException {
        server.start();
        System.out.println("Server started on port " + port);
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("Shutting down gRPC server");
            Server.this.stop();
            System.out.println("Server shut down");
        }));
    }

    public void stop() {
        if (server != null) {
            server.shutdown();
        }
    }

    public void blockUntilShutdown() throws InterruptedException {
        if (server != null) {
            server.awaitTermination();
        }
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        Server server = new Server(50051);
        server.start();
        server.blockUntilShutdown();
    }
}

Go客户端代码

接下来,我们编写Go客户端代码,通过gRPC调用Java服务端提供的RPC方法。

  1. 创建一个名为main.go的Go文件,导入gRPC和自动生成的Go代码。
package main

import (
	"context"
	"log"

	"google.golang.org/grpc"

	pb "path/to/generated/go/package" // 替换为实际的Go生成代码包路径
)

func main() {
	conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("failed to connect: %v", err)
	}
	defer conn.Close()

	client := pb.NewGreetingServiceClient(conn)

	request := &pb.HelloRequest{
		Name: "John",
	}

	response, err := client.SayHello(context.Background(), request)
	if err != nil {
		log.Fatalf("failed to call SayHello: %v", err)
	}

	log.Printf("Response: %s", response.Message)
}

确保将path/to/generated/go/package替换为实际的Go生成代码包的路径。

运行代码

在终端中分别运行Java服务端和Go客户端的代码。

首先,运行Java服务端:

java -cp <path_to_grpc_libraries>:. example.Server

确保将<path_to_grpc_libraries>替换为你的gRPC库的路径。

然后,运行Go客户端:

go run main.go

以上就是go和java的跨平台使用rpc的协议进行调用和数据交换通信的简单案例。文章来源地址https://www.toymoban.com/news/detail-814470.html

到了这里,关于rpc跨平台通信的简单案例,java和go的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++轻量级跨平台桌面GUI库FLTK的简单使用

    C++的跨平台桌面GUI库有很多,大体上分成两种流派:retained mode和immediate mode。 其中前者是主流的桌面GUI机制框架,包括:Qt、wxwidgets、gtk、juce等 后者是一些游戏引擎编辑器常用的GUI机制框架,包括:imgui、nanogui等 使用这些框架都支持构建在windows、mac、linux上面能运行的桌面

    2024年02月08日
    浏览(57)
  • 一个基于.NET Core构建的简单、跨平台、模块化的商城系统

    今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。 商品:分类、品牌、单位、选项(销售属性)、属性、属性模板、属性组。 销售:订单、物流。 内容:首页配置、评论、回复。 配置:国家、用户、仓库

    2024年03月27日
    浏览(210)
  • 【云服务器】关于UDP/TCP跨平台网络通信服务器无响应的情况及解决办法

    本篇文章仅为了记录我在跨平台进行udp通信的时候遇到的问题及解决办法 进行udp网络通信的时候,我用腾讯云服务器作服务端,windows本机作客户端,在进行连接的时候,当我在客户端向服务端发送消息的时候,服务器端接收不到消息(安全组已经配置) 当执行上述命令出现

    2024年02月10日
    浏览(44)
  • java可以跨平台的原因是什么?

    因为不同平台可以安装对应的JVM(Java Virtual Machine),它是C/ C++写的,JVM可以屏蔽所有和平台相关的信息,并帮助把Java文件经过编译后生成的和平台无关的class类文件(也就是字节码)从硬盘读取到内存中,并转换为机器码执行。 总结:一个就是JVM,一个就是生成的运行类文

    2024年02月07日
    浏览(45)
  • 【Java基础学习打卡08】Java语言跨平台原理

    Java语言编程的一大优势便是跨平台,本文将介绍Java语言是如何实现跨平台的。 计算机高级语言按照程序的执行方式可以分为 编译型语言 和 解释型语言 。 编译型语言: 编写的程序源代码需要通过编译器生成机器语言目标文件,在计算机上直接执行目标文件。编译型语言的

    2024年02月09日
    浏览(42)
  • 跨平台兼容,无限可能:Apple Remote Desktop for Mac让远程控制更简单

    Apple Remote Desktop for Mac是一款远程桌面管理软件,提供了一系列强大的功能,让用户可以轻松地管理和控制远程计算机。以下是该软件的一些主要功能和特点: 实时远程访问和控制:使用Apple Remote Desktop,用户可以在任何地方实时访问和控制远程计算机的桌面。这使得技术支持

    2024年01月19日
    浏览(86)
  • flutterui构建工具,Java+性能优化+APP开发+NDK+跨平台技术

    面试的时候除了算法题,其他被怼成弟弟,没想到面试官给过了,一天面完三面并且一周之后收到了oc,觉得自己非常的幸运,终于得到了大厂的认可(虽然是颗白菜)。这里建议网友如果有自己亮点的话,还是可以勇敢大胆的尝试一下大厂,毕竟除了实力之外,运气与机遇也占

    2024年03月15日
    浏览(60)
  • 跨平台的开源Java生成PPT文件工具包,PPTShowV1.3更新啦

    项目官网:https://pptshow.cc/ 参考文档:https://pptshow.cc/book/(GitPage制作,打不开请科学冲浪) 开源地址:https://github.com/qrpcode/pptshow(有帮助记得点star呀~) 国内镜像:中文版本(Gitee)     Github镜像(Gitcode) PPTShow是一个开源的Java生成PPT文档工具包,支持2010版PPTX新特性。

    2024年02月09日
    浏览(48)
  • 关于 Delphi 11.3跨平台开发Android调用 JNI JAR java 的说明和注意事项

    关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2017.10.18 (* ************************************************ *) (* *) (* *) (* 设计:爱吃猪头肉 Flying Wang 2015-04-15  *) (* 上面的版权声明请不要移除。 *) (* *) (* ************************************************ *) 本人所

    2024年02月07日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包