You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于gRPC-java实现单服务器接入6个客户端?求示例

gRPC-Java 单服务器接入多客户端(6个)实现方案

gRPC-Java 基于 HTTP/2 协议,天然支持多路复用,默认就能同时处理大量客户端连接,6个客户端的场景完全不需要额外做特殊配置,按常规流程实现即可。下面是完整的实现示例:

1. 定义gRPC服务接口(.proto文件)

创建 src/main/proto/helloworld.proto 文件,定义简单的RPC服务:

syntax = "proto3";

option java_package = "com.example.grpc";
option java_outer_classname = "HelloWorldProto";
option java_multiple_files = true;

package helloworld;

// 定义Greeter服务
service Greeter {
  // 简单RPC方法:客户端发请求,服务器返回响应
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// 请求消息结构
message HelloRequest {
  string name = 1;
}

// 响应消息结构
message HelloReply {
  string message = 1;
}

2. 生成Java代码

使用 protoc 工具结合gRPC-Java插件生成对应的Java代码,执行以下命令(替换插件路径为你的实际路径):

protoc --java_out=src/main/java \
       --grpc-java_out=src/main/java \
       --plugin=protoc-gen-grpc-java=/path/to/protoc-gen-grpc-java-1.59.0-linux-x86_64 \
       src/main/proto/helloworld.proto

3. 实现服务逻辑

编写服务实现类,继承自动生成的 GreeterGrpc.GreeterImplBase:

package com.example.grpc;

import io.grpc.stub.StreamObserver;

public class GreeterImpl extends GreeterGrpc.GreeterImplBase {
    @Override
    public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
        // 处理请求,生成响应
        String replyMsg = "Hello, " + request.getName() + "!";
        HelloReply reply = HelloReply.newBuilder().setMessage(replyMsg).build();
        
        // 返回响应并结束RPC
        responseObserver.onNext(reply);
        responseObserver.onCompleted();
        
        // 打印客户端请求信息,便于验证多客户端连接
        System.out.println("已处理客户端[" + request.getName() + "]的请求");
    }
}

4. 启动gRPC服务器

编写服务器启动类,绑定端口并注册服务:

package com.example.grpc;

import io.grpc.Server;
import io.grpc.ServerBuilder;

import java.io.IOException;

public class GrpcServer {
    public static void main(String[] args) throws IOException, InterruptedException {
        // 构建服务器,监听50051端口
        Server server = ServerBuilder.forPort(50051)
                .addService(new GreeterImpl())
                .build();
        
        // 启动服务器
        server.start();
        System.out.println("gRPC服务器启动完成,监听端口:50051");
        
        // 阻塞等待服务器终止(避免主线程退出)
        server.awaitTermination();
    }
}

5. 编写客户端并测试多连接

编写客户端类,用于连接服务器并发送请求:

package com.example.grpc;

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

public class GrpcClient {
    public static void main(String[] args) {
        // 检查参数,传入客户端标识
        if (args.length == 0) {
            System.err.println("请传入客户端编号,例如:java GrpcClient 1");
            return;
        }
        
        // 创建通道连接服务器
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
                .usePlaintext() // 生产环境务必使用TLS加密
                .build();
        
        // 创建阻塞式存根(也可使用异步存根)
        GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);
        
        // 发送请求并获取响应
        HelloRequest request = HelloRequest.newBuilder().setName("客户端" + args[0]).build();
        HelloReply reply = stub.sayHello(request);
        
        System.out.println("收到服务器响应:" + reply.getMessage());
        
        // 关闭通道
        channel.shutdown();
    }
}

测试多客户端连接

  • 先启动 GrpcServer
  • 打开6个终端,分别执行以下命令,模拟6个客户端连接:
java com.example.grpc.GrpcClient 1
java com.example.grpc.GrpcClient 2
java com.example.grpc.GrpcClient 3
java com.example.grpc.GrpcClient 4
java com.example.grpc.GrpcClient 5
java com.example.grpc.GrpcClient 6

此时服务器控制台会打印每个客户端的请求处理日志,证明6个客户端已成功连接并与服务器通信。

注意事项

  • 生产环境中,建议配置TLS加密(替换 usePlaintext() 为TLS相关配置),保障通信安全。
  • 如果需要优化性能,可通过 ServerBuilder.executor() 自定义线程池,6个客户端的场景默认线程池完全够用,无需额外调整。

内容的提问来源于stack exchange,提问作者mac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:35:22