java sslsocket程序_JAVA与C++进行sslsocket通信,JAVA做服务端或客户端
前几天有位网友问我关于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做服务端或客户端相关推荐
- java贪吃蛇客户端服务器_java Socket套接字TCP编程开发服务端和客户端之间的通信 - 贪吃蛇学院-专业IT技术平台...
超级简单,没有太多实质内容的Socket服务端,客户端小程序 先运行server 再运行client OK 服务端代码如下: public class Server { public static v ...
- Java快速开发框架_若依——Ruoyi-SpringCloud版本-2.安装redis服务端和客户端-win7
QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群6493473 ...
- java工程窗口程序_java工程开发之图形化界面之(第二课)
上一节主要是讨论小的应用程序,在这里我们将采用一种全新的方式来重新编写它. 在这里我们注重关注JFrame和JOptionPane.这些类提供了在JAVA应用程序使用图形的方法以及在JAVA程序中对I ...
- Java Websocket实例【服务端与客户端实现全双工通讯】
Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...
- Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信
本文计划采用socket实现客户端和服务端的任意双向通信,即客户端可以随时给服务端发消息,服务端也可以随时给客户端发消息,最终结果就是一个类似与QQ的聊天软件的功能. 以下代码可以直接拷贝到Eclip ...
- Java中利用socket实现简单的服务端与客户端的通信(入门级)
Java编程中,要想要使用网络通信,就离不开Socket编程,在此对socket进行简单的介绍.首先声明,这是一个入门级的介绍,仅仅简单的实现了客户端向服务端发送数据,服务端正常的接收数据,当接收到特 ...
- Java中Socket通信-服务端和客户端双向传输字符串实现
场景 什么是socket 在计算机通信领域,socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台计算机可以接收其他计算机 ...
- 用Java实现HTTP Multipart的服务端和客户端
今天简单介绍一下如何用Java支持HTTP Multipart的request和response. 整个项目的代码可以在https://github.com/mcai4gl2/multi下载. 在这个 ...
- 单点登录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 ...
最新文章
- 20162303 2016-2017-2 《程序设计与数据结构》第六周学习总结
- android上的i-jetty (1)环境搭建
- NIO入门系列之第3章:从理论到实践:NIO 中的读和写
- docker快速搭建RabbitMQ集群
- 【JS】教你如何在对象内任意位置插入任意属性
- SAP License:SAP货币转换
- 稳的一比,鸿蒙系统霸榜Github!
- ssm在线视频教育网站
- c++实现多对多生产者消费者和socket连用
- cadence SPB17.4 - orcad - 层次原理图
- 微信小程序 -- 授权地理位置
- 关于NetCore+饿了么开放平台+奇门+聚石塔对接的解释说明
- JMeter Linux下执行测试
- Qt中使用多线程并返回结果到主线程的例子
- “华为“和“荣耀”区别日益明显,荣耀传递潮流价值观
- 美团点评女技术总监任登君:不要给自己的人生设限
- 图片怎么压缩?这些方法值得收藏
- 带你玩转序列模型之循环神经网络(一)
- C语言共用体中,共用体变量的规律
- c#考试,答题系统制作(窗体)