前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈。 本文测试环境: 系统:WINDOWS 7(第3、6步)、OS X 10.9(第4步) 软件:VS 2012(第3、6步)、Eclipse(第5、6步) 硬件:iPad 2(第4步)、Macbook Pro

一、JAVA做服务端,读取pem格式的证书和秘钥 public class SocketServer extends Thread{

private static final int SERVER_PORT = 10002;

private SSLServerSocket serverSocket;

public SocketServer() {

// Initialize SSLServer

try {

//Load KeyStore And TrustKeyStore

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

//保存服务端的私钥

KeyStore keyStore = KeyStore.getInstance("JKS");

keyStore.load(null, null);//

// 读入服务端证书

PEMReader cacertfile = new PEMReader(new InputStreamReader(

new FileInputStream("d:/cacert.pem")));

X509Certificate cacert = (X509Certificate) cacertfile.readObject();

Certificate[] certChain = new Certificate[1];

certChain[0] = cacert;

cacertfile.close();

// 读入私钥

PEMReader kr = new PEMReader(new InputStreamReader(new FileInputStream("d:/privkey.pem")));

KeyPair key = (KeyPair) kr.readObject();

kr.close();

// 导入服务端端私钥和证书

keyStore.setKeyEntry("serverkey", key.getPrivate(), new char[]{}, certChain );

keyStore.setCertificateEntry("servercert", cacert);

//Initialize KeyStore Factory

创建用于管理JKS密钥库的X.509密钥管理器

KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");

keyManagerFactory.init(keyStore, "".toCharArray());

//Initialize SSLContext

SSLContext context = SSLContext.getInstance("TLSv1");

//授权的密钥管理器,用来授权验证,

context.init(keyManagerFactory.getKeyManagers(), null, null);

//Set up Server Socket

serverSocket = (SSLServerSocket) context.

getServerSocketFactory().createServerSocket(SERVER_PORT);

serverSocket.setWantClientAuth(false); //不需要客户端证书

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

public void run() {

if(serverSocket == null){

System.out.println("Null server socket");

return;

}

try {

Socket socket = serverSocket.accept();

//Receive From Client

InputStream input = socket.getInputStream();

System.out.println("------Receive------");

//use byte array to initialize the output string

System.out.println(new String(StreamToByteArray(input)));

if(!socket.isClosed()){

//Response To Client

OutputStream output = socket.getOutputStream();

output.write("服务端发送123".getBytes());

output.flush();

socket.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* convert stream to Byte Array

* @param inputStream

* @return

* @throws IOException

*/

public byte[] StreamToByteArray(InputStream inputStream) throws IOException {

ByteArrayOutputStream bout = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int readIndex = inputStream.read(buffer);

bout.write(buffer, 0, readIndex);

bout.flush();

bout.close();

//inputStream.close();

return bout.toByteArray();

}

public static void main(String[] args){

System.out.println("=======Start Server !======");

new SocketServer().run();

}} 二、JAVA做客户端,读取pem格式证书和秘钥 public class SocketClient2 {

private Logger logger = LoggerFactory.getLogger(SocketClient2.class);

private String tpath = Tools.getConfig("简述: 建立简单的server与client,在利用socket上通信 知识点: 1. java socket 通信 2. java GUI的几个控件 3. 多线程并发 代码: SimpleChatServer.java [java]

view plain copy package test.chatclient;

import java.io.*;

import java.net.*;KeyPath");// 证书路径

private String ip = Tools.getConfig("ip");// 服务端ip

private int port = Integer.parseInt(Tools.getConfig("port"));// 端口

public static List socketList = new ArrayList();

public SSLSocket getSSlSocket() {

SSLContext context = null;

context = this.getSSLcontext();

SSLSocketFactory ssf = context.getSocketFactory();

try {

SSLSocket ss = (SSLSocket) ssf.createSocket("127.0.0.1", 10002);

String[] protocols = { "TLSv1" }; //设置客户端协议

ss.setEnabledProtocols(protocols);

return ss;

} catch (UnknownHostException e) {

logger.error("a{}", e);

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

private SSLContext getSSLcontext() {

SSLContext sslContext = null;

try {

// 设定Security的Provider提供程序

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());//

System.setProperty("https.protocols", "SSLv3,SSLv2Hello");

// 建立空BKS,android只能用BKS(BouncyCastle密库),一般java应用参数传JKS(java自带密库)

//访问Java密钥库,JKS是keytool创建的Java密钥库,保存密钥。

KeyStore ksKeys = KeyStore.getInstance("JKS");

ksKeys.load(null, null);

// 读入客户端证书

PEMReader cacertfile = new PEMReader(new InputStreamReader(

new FileInputStream("d:/cacert.pem")));

X509Certificate cacert = (X509Certificate) cacertfile.readObject();

cacertfile.close();

// 导入根证书作为trustedEntry

//KeyStore.TrustedCertificateEntry

保存可信的 Certificate 的 KeyStore 项。

KeyStore.TrustedCertificateEntry trustedEntry = new KeyStore.TrustedCertificateEntry(

cacert);

//用指定别名保存 keystore Entry。

ksKeys.setEntry("ca_root", trustedEntry, null);

// 构建TrustManager

创建用于管理JKS密钥库的X.509密钥管理器。

TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");// 密钥管理器

tmf.init(ksKeys);

// 构建SSLContext,此处传入参数为TLS,也可以为SSL

sslContext = SSLContext.getInstance("TLSv1");

sslContext.init(null, tmf.getTrustManagers(), null);

} catch (Exception e) {

e.printStackTrace();

}

return sslContext;

}

public static void main(String[] args) {

SocketClient2 client = new SocketClient2();

SSLSocket ss =client.getSSlSocket();

try {

ss.setSoTimeout(2000);

OutputStream socketOut = null;

if (ss != null && !ss.isClosed()) {

socketOut = ss.getOutputStream();

socketOut.write("客户端发送".getBytes());

socketOut.flush();

}

if (ss != null && !ss.isClosed()) {

InputStream in;

in = ss.getInputStream();

//input中的数据只能读取一次

System.out.println(new String(StreamToByteArray(in)));

}

ss.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* convert stream to Byte Array

* @param inputStream

* @return

* @throws IOException

*/

public static byte[] StreamToByteArray(InputStream inputStream) throws IOException {

ByteArrayOutputStream bout = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int readIndex = inputStream.read(buffer);

bout.write(buffer, 0, readIndex);

bout.flush();

bout.close();

return bout.toByteArray();

}

} 三、证书

注:此服务端和客户端可以进行通信也可与C++进行通信。

java sslsocket程序_JAVA与C++进行sslsocket通信,JAVA做服务端或客户端相关推荐

  1. java贪吃蛇客户端服务器_java Socket套接字TCP编程开发服务端和客户端之间的通信 - 贪吃蛇学院-专业IT技术平台...

    超级简单,没有太多实质内容的Socket服务端,客户端小程序 先运行server 再运行client OK 服务端代码如下: public class Server { public static v ...

  2. Java快速开发框架_若依——Ruoyi-SpringCloud版本-2.安装redis服务端和客户端-win7

    QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群6493473 ...

  3. java工程窗口程序_java工程开发之图形化界面之(第二课)

    上一节主要是讨论小的应用程序,在这里我们将采用一种全新的方式来重新编写它. 在这里我们注重关注JFrame和JOptionPane.这些类提供了在JAVA应用程序使用图形的方法以及在JAVA程序中对I ...

  4. Java Websocket实例【服务端与客户端实现全双工通讯】

    Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...

  5. Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信

    本文计划采用socket实现客户端和服务端的任意双向通信,即客户端可以随时给服务端发消息,服务端也可以随时给客户端发消息,最终结果就是一个类似与QQ的聊天软件的功能. 以下代码可以直接拷贝到Eclip ...

  6. Java中利用socket实现简单的服务端与客户端的通信(入门级)

    Java编程中,要想要使用网络通信,就离不开Socket编程,在此对socket进行简单的介绍.首先声明,这是一个入门级的介绍,仅仅简单的实现了客户端向服务端发送数据,服务端正常的接收数据,当接收到特 ...

  7. Java中Socket通信-服务端和客户端双向传输字符串实现

    场景 什么是socket 在计算机通信领域,socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台计算机可以接收其他计算机 ...

  8. 用Java实现HTTP Multipart的服务端和客户端

    今天简单介绍一下如何用Java支持HTTP Multipart的request和response. 整个项目的代码可以在https://github.com/mcai4gl2/multi下载. 在这个 ...

  9. 单点登录cas综述之cas4.2.7服务端+cas客户端+示例程序+环境搭建说明-陈杰

    1环境搭建以及把示例程序跑起来 1.1  安装jdk1.8 1.2 下载tomcat8+cas4.2.7服务端war+cas客户端war 1.2.1下载经过配置的Tomcat8和本教程配套文件 1.2 ...

最新文章

  1. 20162303 2016-2017-2 《程序设计与数据结构》第六周学习总结
  2. android上的i-jetty (1)环境搭建
  3. NIO入门系列之第3章:从理论到实践:NIO 中的读和写
  4. docker快速搭建RabbitMQ集群
  5. 【JS】教你如何在对象内任意位置插入任意属性
  6. SAP License:SAP货币转换
  7. 稳的一比,鸿蒙系统霸榜Github!
  8. ssm在线视频教育网站
  9. c++实现多对多生产者消费者和socket连用
  10. cadence SPB17.4 - orcad - 层次原理图
  11. 微信小程序 -- 授权地理位置
  12. 关于NetCore+饿了么开放平台+奇门+聚石塔对接的解释说明
  13. JMeter Linux下执行测试
  14. Qt中使用多线程并返回结果到主线程的例子
  15. “华为“和“荣耀”区别日益明显,荣耀传递潮流价值观
  16. 美团点评女技术总监任登君:不要给自己的人生设限
  17. 图片怎么压缩?这些方法值得收藏
  18. 带你玩转序列模型之循环神经网络(一)
  19. C语言共用体中,共用体变量的规律
  20. c#考试,答题系统制作(窗体)

热门文章

  1. C ++基本输入/输出
  2. TVM Reduction降低算力
  3. Python分析离散心率信号(上)
  4. 客快物流大数据项目(九):Docker常用命令
  5. 【hexo】搭建个人bolg日志 day1
  6. Python bytes 的使用
  7. Ubuntu 系统禁止或者改变中文简体切换繁体,方便使用AS全局搜索
  8. 微信小程序bindtap 与 catchtap 是使用
  9. JS导出PDF插件(支持中文、图片使用路径)
  10. Android studio第一次使用配置(三)gradle项目构建