一、pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.edu.tju</groupId>
<artifactId>grpc-test-server-side-stream</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<grpc-version>1.54.0</grpc-version>
</properties>
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-core</artifactId>
<version>${grpc-version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>${grpc-version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>${grpc-version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>${grpc-version}</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.22.2</version>
</dependency>
</dependencies>
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.7.1</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.54.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
二、在src/main/proto目录创建proto文件 welcome.proto
syntax = "proto3";
option java_package = "cn.edu.tju.test";
option java_multiple_files=true;
package cn.edu.tju.test;
message WelcomeRequest {
string name =1;
int32 time =2;
}
message WelcomeResponse {
string message =1;
}
service WelcomeService {
rpc getInfo(WelcomeRequest) returns (stream WelcomeResponse){};
}
三、mvn clean install 生成java代码,并拷贝到src相关的包下
四、编写服务端实现
package cn.edu.tju.test;
import io.grpc.stub.StreamObserver;
public class WelcomeServiceImpl extends WelcomeServiceGrpc.WelcomeServiceImplBase {
public void getInfo(WelcomeRequest request, StreamObserver<WelcomeResponse> responseObserver) {
String name =request.getName();
int time = request.getTime();
for(int i =0 ;i< time ; i++){
WelcomeResponse welcomeResponse =WelcomeResponse.newBuilder().setMessage("welcome " +name+" "+i).build();
responseObserver.onNext(welcomeResponse);
}
responseObserver.onCompleted();
}
}
五、编写服务器
package cn.edu.tju.test;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import java.io.IOException;
public class WelcomeServer {
public static void main(String[] args) throws Exception {
Server s = ServerBuilder.forPort(50061)
.addService(new WelcomeServiceImpl())
.build();
s.start();
System.out.println("server started......");
s.awaitTermination();
}
}
六、编写客户端
package cn.edu.tju.test;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import java.util.Iterator;
public class WelcomeClient {
public static void main(String[] args) throws Exception{
ManagedChannel managedChannel = ManagedChannelBuilder.forTarget("localhost:50061").usePlaintext()
.build();
WelcomeServiceGrpc.WelcomeServiceBlockingStub stub = WelcomeServiceGrpc.newBlockingStub(managedChannel);
WelcomeRequest req = WelcomeRequest.newBuilder().setName("amadeus").setTime(3).build();
Iterator<WelcomeResponse> infoStream = stub.getInfo(req);
while(infoStream.hasNext()){
WelcomeResponse res = infoStream.next();
System.out.println(res.getMessage());
}
}
}
七、分别运行服务器和客户端