java tls 实例_grpc加密TLS初体验(go、java版本)

grpc加密TLS初体验(go、java版本)

grpc-go、java的安装编译helloworld可以参考如下文章

openssl的安装、生成秘钥证书可以参考如下文章

示例代码go版本

服务端代码

package main

import (

"fmt"

"log"

"net"

pb "github.com/grpc/grpc-common/go/helloworld"

"golang.org/x/net/context"

"google.golang.org/grpc"

"google.golang.org/grpc/credentials"

)

const (

port = ":50051"

)

type server struct{}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {

fmt.Println("--->>> request name = ", in.Name)

return &pb.HelloReply{Message: "--->>> Hello " + in.Name}, nil

}

func main() {

lis, err := net.Listen("tcp", port)

if err != nil {

log.Fatalf("failed to listen: %v", err)

}

fmt.Println(">>> server is starting in 127.0.0.1 and port " + port + " >>>")

s := grpc.NewServer()

pb.RegisterGreeterServer(s, &server{})

creds, err := credentials.NewServerTLSFromFile("D:/BaiduYunDownload/server1.pem", "D:/BaiduYunDownload/server1.key")

if err != nil {

fmt.Println("Failed to generate credentials: ", err)

}

s.Serve(creds.NewListener(lis))

}

客户端代码

package main

import (

"log"

"os"

pb "github.com/grpc/grpc-common/go/helloworld"

"golang.org/x/net/context"

"google.golang.org/grpc"

"google.golang.org/grpc/credentials"

)

const (

address     = "127.0.0.1:50051"

defaultName = "world"

)

func main() {

var opts []grpc.DialOption

var creds credentials.TransportAuthenticator

var err error

creds, err = credentials.NewClientTLSFromFile("D:/BaiduYunDownload/ca.pem", "x.test.youtube.com")

if err != nil {

log.Fatalf("Failed to create TLS credentials %v", err)

}

opts = append(opts, grpc.WithTransportCredentials(creds))

conn, err := grpc.Dial(address, opts...)

if err != nil {

log.Fatalf("did not connect: %v", err)

}

log.Printf(">>> connect success >>>")

defer conn.Close()

c := pb.NewGreeterClient(conn)

name := defaultName

if len(os.Args) > 1 {

name = os.Args[1]

}

r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})

if err != nil {

log.Fatalf("could not greet: %v", err)

}

log.Printf("Greeting: %s", r.Message)

}

示例代码java版本

服务端代码:

packageio.grpc.examples.helloworld;

importio.grpc.ServerImpl;

importio.grpc.stub.StreamObserver;

importio.grpc.transport.netty.NettyServerBuilder;

importio.netty.handler.ssl.SslContext;

importjava.io.File;

importjava.util.logging.Logger;

public classHelloWorldServer {

private static finalLoggerlogger= Logger

.getLogger(HelloWorldServer.class.getName());

private int port= 50051;

privateServerImplserver;

private voidstart()throwsException {

@SuppressWarnings("deprecation")

SslContext sslContext = SslContext.newServerContext(newFile(

"D:/BaiduYunDownload/server3.pem"),newFile(

"D:/BaiduYunDownload/server3_pkcs8.key"));

server= NettyServerBuilder.forPort(port).sslContext(sslContext)

.addService(GreeterGrpc.bindService(newGreeterImpl())).build()

.start();

logger.info("Server started, listening on "+port);

Runtime.getRuntime().addShutdownHook(newThread() {

@Override

public voidrun() {

System.err

.println("*** shutting down gRPC server since JVM is shutting down");

HelloWorldServer.this.stop();

System.err.println("*** server shut down");

}

});

}

private voidstop() {

if(server!=null) {

server.shutdown();

}

}

public static voidmain(String[] args)throwsException {

finalHelloWorldServer server =newHelloWorldServer();

server.start();

}

private classGreeterImplimplementsGreeterGrpc.Greeter {

@Override

public voidsayHello(HelloRequest req,

StreamObserver responseObserver) {

System.out.println("--->>> name = "+ req.getName());

HelloResponse reply = HelloResponse.newBuilder()

.setMessage("Hello "+ req.getName()).build();

responseObserver.onValue(reply);

responseObserver.onCompleted();

}

}

}

客户端代码:

packageio.grpc.examples.helloworld;

importio.grpc.ChannelImpl;

importio.grpc.transport.netty.NegotiationType;

importio.grpc.transport.netty.NettyChannelBuilder;

importio.netty.handler.ssl.SslContext;

importjava.io.File;

importjava.security.NoSuchAlgorithmException;

importjava.util.concurrent.TimeUnit;

importjava.util.logging.Level;

importjava.util.logging.Logger;

importjavax.net.ssl.SSLException;

public classHelloWorldClient {

private static finalLoggerlogger= Logger

.getLogger(HelloWorldClient.class.getName());

private finalChannelImplchannel;

private finalGreeterGrpc.GreeterBlockingStubblockingStub;

publicHelloWorldClient(String host,intport)throwsSSLException,

NoSuchAlgorithmException {

@SuppressWarnings("deprecation")

//这里要注意下由于java版本的没有提供像go那样的可以指定域名

// java版本源代码中把host传入作为证书域名

//域名是在证书生成的过程中自己输入的

SslContext sslContext = SslContext.newClientContext(newFile(

"D:/BaiduYunDownload/ca3.pem"));

channel= NettyChannelBuilder.forAddress(host, port)

.sslContext(sslContext).negotiationType(NegotiationType.TLS)

.build();

blockingStub= GreeterGrpc.newBlockingStub(channel);

}

public voidshutdown()throwsInterruptedException {

channel.shutdown().awaitTerminated(5, TimeUnit.SECONDS);

}

public voidgreet(String name) {

try{

logger.info("Will try to greet "+ name);

HelloRequest request = HelloRequest.newBuilder().setName(name)

.build();

HelloResponse response =blockingStub.sayHello(request);

logger.info("Greeting: "+ response.getMessage());

}catch(RuntimeException e) {

logger.log(Level.WARNING,"RPC failed", e);

return;

}

}

public static voidmain(String[] args)throwsException {

HelloWorldClient client =newHelloWorldClient("localhost", 50051);

try{

String user ="world";

if(args.length> 0) {

user = args[0];

}

client.greet(user);

}finally{

client.shutdown();

}

}

}

示例代码下载

有疑问加站长微信联系(非本文作者)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java的svn插件maver_项目版本管理工具---MAVENSVN

在进行实际项目开发时往往不是由一个人去完成一整个项目,而是分模块进行完成最后将所有项目进行聚合,那么就可以用到maven和svn。MAVEN是用来管理项目的,我认为它最大的优势就在于依赖和聚合吧,而svn的优势就在于版本控制&#xf…

java第一次上机_java第一次上机实验--验证码

1 package javashiyan;23 import java.awt.Color;4 import java.awt.event.ActionEvent;5 import java.awt.event.ActionListener;67 import javax.swing.*;89 public class Yanzhen extends JFrame10 {11 //定义成员变量12 private Mypanel mp;13 private JButton b;14 privat…

java实现extended smtp_java实现发送邮件(SMTP)

1.pom引入包javax.mailmail1.4.72.Email实体类import lombok.Data;import lombok.EqualsAndHashCode;import lombok.experimental.Accessors;import java.util.List;import java.util.Map;/*** ClassName: Email* author: mxy* Description: Email的实体类*/DataEqualsAndHashC…

java实现封装的三步是_JAVA基础-封装

封装的概念 通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值(比如年龄是500). 无论是编译阶段还是运行阶段都不会报错或者给出提示, 此时与现实生活不符 为了避免上述错误的发生, 就需要对成员变量进行密封包装处理,来隐藏成员变量的细节以及保证成员变量数值的合…

java中广告维护轮播图怎么做_Banner广告轮播图

需求描述轮播图也是大部分app都有的效果,商品类跟新闻类的app是肯定会有的。轮播图的效果跟第一次启动时的引导页类似,不过轮播图在引导页的基础上多了几个功能:在第一页也能向左滑动,在最后一页也能向右滑动有个计时器,每隔一段时间滚动轮播…

java addcallback函数_java中怎么使用callback函数?

UYOU在很多场景,作为开发都会想到,在执行完毕一个任务的时候,能执行一个callback函数是多么好的事情。现在模拟一下这个情景:定义三个类。分别是主函数类。callback函数的接口类。业务处理类。在业务处理类中,处理完业…

oracle 数据抽取 java_oracle数据抽取步骤

oracle数据抽取步骤Database links:1、 在本地计算机上,新建一个连接远程数据库的连接,并记住这个连接的服务名(例如:jzfx_remote);2、 返回远程数据库的GLOBAL_NAME:执行:SELECT * FROM GLOBA…

在java中的交换方法有哪些_java中交换两个变量的值有哪几种方法,交换两个变量a和b的值...

java中交换两个变量的值有哪几种方法在Java中,有哪些方法可以交换两个变量的值,方法:1.定义临时变量2.没有必要定义临时变量3.使用位运算符(学习视频分享:java课程)代码示例:公共类SwapTest {公共静态void main(String…

java修改原有txt文件_(转)Java创建txt文件并进行读、写、修改操作

Creation date: 2007-12-18 - 下午06:48:45 */ public class ReadWriteFile { public static BufferedReader bufread; //指定文件路径和名称 private static String path "D:/suncity.txt"; private static File filename new File(path); private static String …

java暂停另一个线程_如何从另一个线程终止或暂停Rust线程?

对于终止和挂起线程,您可以使用通道 .外部终止在工作循环的每次迭代中,我们检查是否有人通过渠道通知我们 . 如果是,或者如果通道的另一端超出范围,我们就会打破循环 .use std::io::{self, BufRead};use std::sync::mpsc::{self, …

java 7 jboss_JBoss7 入门指南

1、下载地址: http://www.jboss.org/jbossas/downloads ,下载Certified Java EE 6 Full Profile版本。2、解压 jboss-as-7.1.1.Final.zip 到 D:\programs。3、设置环境变量如下:系统变量->新建->变量名:JAVA_HOME C:\Java以…

java实现bloom filter_Java BloomFilter.add方法代码示例

import org.apache.hadoop.util.bloom.BloomFilter; //导入方法依赖的package包/类Overridepublic int run(String[] args) throws Exception {if (args.length ! 4) {System.err.println("Usage: Trainer ");return 1;}// Parse command line argumentsPath inputFi…

java系统项目分为哪五大层次?控制层_业务_一个项目中说系统分为表现层、控制层、逻辑层、DAO层和最终数据库五层架构-转...

表现层就是看到的东西,比如你现在看到的当前页面控制层就将你的请求从页面传到后台代码逻辑层就是处理你的请求的代码DAO层就是将数据存到数据库中的代码数据库就是数据库了,存东西用的,DAO层就是将访问数据库的代码,数据库层是数…

opc客户端读取数据品质是bad_听说看了这篇文章就彻底搞懂了什么是OPC(上)

从2000年初以来,我们就一直在使用OPC软件互操作性标准,而那些正准备踏入和想要踏入工业自动化领域的人们却对这些含义感到困惑。所以在本中,我将系统地为你梳理OPC知识。OPC首字母缩写词代表什么?问一个OPC老手,他们或…

java怎么将程序保存在桌面_在Java桌面应用程序中保留数据的最佳方法是什么?...

我的桌面应用程序中有一大堆Java对象,我试图决定将文件作为文件系统的最佳方式.我曾经有过一些想法:>使用DataOutputStream滚动我自己的串行器:这将给我最大的控制文件中的内容,但是以微量管理为代价.>使用ObjectOutputStream及其各种相关类的直接…

JAVA实现inotify一样的功能_WPF实现INotifyPropertyChanged

我已经设置了一个属性并实现了INotifyPropertyChanged像这样......public event PropertyChangedEventHandler PropertyChanged;public FlowProcess LastSelectedFlowProcess{get { return _lastSelectedFlowProcess; }set{_lastSelectedFlowProcess value;Notify("LastS…

php导入json文件_[php]导入超大json文件

前言在之前的文章《做一个twitter的插件玩玩》中,我做了一个批量删除推文(转发推文)的工具,该工具能够删除前3200条推文,但因为总数太多(4.3万条),api接口不支持获取所有的推文,所以我采用了下载的方式,直接…

php 生成dbf,php 读取vfp 8.0,9.0所产生的dbf文件

VFP 9.0 PHP odbc求大神指导。。。由VFP8.0以上制造的DBF文件,自带的Tabel Type> autoinc field 或者Blob field,想通过PHP读取,不行吗?代码很简单如下》$add’c://BatMan//Daten//ladert2.DBF’;$e”Driver{Microsoft Visual …

linux怎样写java代码,linux 怎么写java

linux 怎么写java一、环境安装由于使用 yum 或者 apt-get 命令 安装 openjdk 可能存在类库不全,从而导致用户在安装后运行相关工具时可能报错的问题,所以此处我们推荐采用手动解压安装的方式来安装 JDK。具体步骤如下:1.下载 JDK进入Oracle官…

java登陆密码验证失败,java用户名密码验证示例代码分享

类:NameII 权限:public方法:main 权限:public参数:name,password,denglu,i;参数介绍:name,数据类型 String ,用来存储一个从 input 中获取的值,在本程序当中用作用户名的存放;password,数据类型 String &#xf…