第三节:grpc1.18.0 在JAVA中调用c++发布的服务

查看

第一节入门:https://blog.csdn.net/shan165310175/article/details/86618932

第二节C++编译helloworld工程:https://blog.csdn.net/shan165310175/article/details/86619128

 

0. 建立maven工程(使用Idea ide)

1.maven添加依赖和插件:

	
		
			io.grpc
			grpc-netty-shaded
			1.18.0
		
		
			io.grpc
			grpc-protobuf
			1.18.0
		
		
			io.grpc
			grpc-stub
			1.18.0
		

	

	
		
			
				kr.motd.maven
				os-maven-plugin
				1.5.0.Final
			
		
		
			
				org.xolstice.maven.plugins
				protobuf-maven-plugin
				0.5.1
				
					com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}
					grpc-java
					io.grpc:protoc-gen-grpc-java:1.17.1:exe:${os.detected.classifier}
				
				
					
						
							compile
							compile-custom
						
					
				
			
		
	

如果出现插件爆红,下载不下来的,那么将代码贴到dependency中:


   org.xolstice.maven.plugins
   protobuf-maven-plugin
   0.5.1

下载完之后再删除。

此时插件那边显示:

第三节:grpc1.18.0 在JAVA中调用c++发布的服务_第1张图片

2. 建立main/proto目录,将helloworld.proto拷贝到目录中

3.双击上面的编译命令编译proto文件,生成如下文件:

第三节:grpc1.18.0 在JAVA中调用c++发布的服务_第2张图片

4.新建HelloworldClient类,内容如下:

package com.daily;

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.StatusRuntimeException;
import io.grpc.examples.helloworld.GreeterGrpc;
import io.grpc.examples.helloworld.HelloReply;
import io.grpc.examples.helloworld.HelloRequest;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;

public class HelloWorldClient {
	private static final Logger logger = Logger.getLogger(HelloWorldClient.class.getName());

	private final ManagedChannel channel;
	private final GreeterGrpc.GreeterBlockingStub blockingStub;
//	private final GreeterGrpc.GreeterFutureStub blockingStub;


	/** Construct client connecting to HelloWorld server at {@code host:port}. */
	public HelloWorldClient(String host, int port) {
		this(ManagedChannelBuilder.forAddress(host, port)
				// Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
				// needing certificates.
				.usePlaintext()
				.build());
	}

	/** Construct client for accessing HelloWorld server using the existing channel. */
	HelloWorldClient(ManagedChannel channel) {
		this.channel = channel;
		blockingStub = GreeterGrpc.newBlockingStub(channel);
//		blockingStub = GreeterGrpc.newFutureStub(channel);
	}

	public void shutdown() throws InterruptedException {
		channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
	}

	private ExecutorService threadPool = Executors.newFixedThreadPool(30);

	/** Say hello to server. */
	public void greet(String name) {
		//logger.info("Will try to greet " + name + " ...");
		HelloRequest request = HelloRequest.newBuilder().setName(name).build();
		HelloReply response;
		try {


			HelloReply helloReply = blockingStub.sayHello(request);
			System.out.println(helloReply.getMessage());


		} catch (StatusRuntimeException e) {
			logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
			return;
		}
		//System.out.println("Greeting: " + response.getMessage());
	}

	/**
	 * Greet server. If provided, the first element of {@code args} is the name to use in the
	 * greeting.
	 */
	public static void main(String[] args) throws Exception {

		HelloWorldClient client = new HelloWorldClient("localhost", 50051);
		try {
			for (int i = 0;i < 5;++i) {
				client.greet("小明"+i);
			}
			System.out.println("end>>>>>>>>>>>>>>>>>>>>>>>");
		} finally {
			client.shutdown();
		}

		Thread.sleep(5000);
	}
}

main函数中就是主要调用,该调用是同步的。

注释部分有异步的。blockingStub = GreeterGrpc.newFutureStub(channel);

开启c++服务:

第三节:grpc1.18.0 在JAVA中调用c++发布的服务_第3张图片

运行java后输出:

第三节:grpc1.18.0 在JAVA中调用c++发布的服务_第4张图片

 此时java调用C++服务成功。

 

你可能感兴趣的:(Java)