冲刺DAY2
冲刺DAY2
1 今日任务完成情况
1.1 功能整合
功能已整合,完成各个函数之间的接口调用
1.2 安全证书发放
安全证书发放
安全证书模块正在编写,证书发放部分基本完成。
本次实现过程中,设计使用证书来代表用户的身份。通过不同的用户使用不同的证书,实现不同身份的认证,用户需要使用证书的时候,还需要进行口令验证才能使用证书,一定程度确保安全。通过使用证书中的密钥,可以实现将公文上传到云存储服务器的加密,以及本系统中将公文进行点对点传输过程中的加密。
安全证书是用来唯一确认安全电子商务交易方身份的工具。持卡人安全证书是付款卡的一种电子表示。由于它由证书管理中心做了数字签名,因此,任何第三方都无法修改证书的内容。
1.3 多线程实现
多用户服务器是指服务器能同时支持多个用户并发访问服务器所提供的服务资源,在java中有两种实现多线程的方法,一是使用Thread类,二是使用Runnable类并实现run()方法。
//使用Runnable类,作为匿名内部类
class Handler implements Runnable {
public void run() {
//实现run方法
}
}
服务器面临很多客户的并发连接,这种情况的多线程方案一般是:
主线程只负责监听客户请求和接受连接请求,用一个线程专门负责和一个客户对话,即一个客户请求成功后,创建一个新线程来专门负责该客户。对于这种方案,可以用上一篇方式new Thread创建线程,但是频繁创建线程需要消耗大量系统资源。所以不采用这种方法。
对于服务器,一般使用线程池来管理和复用线程。线程池内部维护了若干个线程,没有任务的时候,这些线程都处于等待状态。如果有新任务,就分配一个空闲线程执行。如果所有线程都处于忙碌状态,新任务要么放入队列等待,要么增加一个新线程进行处理。
目前完成了sever端的多线程处理,分为基本和ssl的,代码如下:
TaskThread
package server;
import java.net.Socket;
import server.ProtocolServer;
public class TaskThread implements Runnable{
private Socket socket = null;
private ProtocolServer protocol = null;
public TaskThread(ProtocolServer protocol) {
this.protocol = protocol;
}
public boolean isIdle() {
return socket == null;
}
public synchronized void run() {
protocol.service();
}
}
TaskThreadSSL
package server;
import java.net.Socket;
public class TaskThreadSSL implements Runnable{
private Socket socket = null;
private ProtocolServerSSL protocol = null;
public TaskThreadSSL(ProtocolServerSSL protocolServerSSL) {
this.protocol = protocolServerSSL;
}
public boolean isIdle() {
return socket == null;
}
public synchronized void run() {
protocol.service();
}
}
1.4 加密传输实现
使用SSL协议初步实现了加密传输
SSL协议(Secure Socket Layer,安全套接层)是由网景(Netscape)公司推出的一种安全通信协议,它能够对信用卡和个人信息提供较强的保护。SSL是对计算机之间整个会话进行加密的协议。在SSL中,采用了公开密钥和私有密钥两种加密方法。所以使用SSL协议后我们就可以保证网络中传输的数据不被非法用户窃取到了。
服务端部分代码如下
public ServerConnector(String keyStoreFile,String keyStorePass,String trustKeyStoreFile,String trustKeyStorePass,
int port){
this.keyStoreFile = keyStoreFile;
this.keyStorePass = keyStorePass;
this.trustKeySoreFile = trustKeyStoreFile;
this.trustKeyStorePass = trustKeyStorePass;
this.port = port;
}
public ServerConnector(){
}
public void reset(KeyManage keyManage){
this.keyManage = keyManage;
this.ctx = keyManage.getSSLContext();
//重置socket
if(this.socket != null && !this.socket.isClosed()){
try {
this.socket.close();
socket = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void reset(){
//重置socket
if(this.socket != null && !this.socket.isClosed()){
try {
this.socket.close();
socket = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(this.serverSocket != null && !this.serverSocket.isClosed()){
try {
this.serverSocket.close();
serverSocket = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 开始监听传输请求
*/
public boolean startListen(int port){
this.port = port;
reset();
try {
serverSocket = (SSLServerSocket)ctx.getServerSocketFactory().createServerSocket(port);
serverSocket.setNeedClientAuth(true);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(serverSocket == null){
setLastError("安全套接字初始化失败!");
return false;
}
try {
//产生通信套接字
socket = serverSocket.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
setLastError(e.getMessage());
e.printStackTrace();
return false;
}
return true;
}
/**
* 初始化SSL设置
*/
private boolean init(){
try {
ctx = SSLContext.getInstance("SSL");
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
keyStore = KeyStore.getInstance("JKS");
trustKeyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream(keyStoreFile), keyStorePass.toCharArray());
trustKeyStore.load(new FileInputStream(trustKeySoreFile),trustKeyStorePass.toCharArray());
kmf.init(keyStore, keyStorePass.toCharArray());
tmf.init(trustKeyStore);
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
serverSocket = (SSLServerSocket)ctx.getServerSocketFactory().createServerSocket(port);
serverSocket.setNeedClientAuth(true);
if(serverSocket == null){
setLastError("安全套接字初始化失败!");
return false;
}
} catch (Exception e) {
// TODO Auto-generated catch block
setLastError(e.getMessage());
e.printStackTrace();
return false;
}
return true;
}
public void closeConnection(){
reset();
}
/**
* 返回SSL套接字
*/
public Socket getSSLSocket(){
return socket;
}
public void setLastError(String error){
lastError = error;
}
public String getLastError(){
return lastError;
}
客户端部分代码如下
public ClientConnector(String keyStoreFile,String keyStorePass,String trustKeyStoreFile,String trustKeyStorePass,
int port,String serverAddress){
this.keyStoreFile = keyStoreFile;
this.keyStorePass = keyStorePass;
this.trustKeySoreFile = trustKeyStoreFile;
this.trustKeyStorePass = trustKeyStorePass;
this.port = port;
this.serverAddress = serverAddress;
}
public ClientConnector(){
}
public void reset(KeyManage keyManage){
this.keyManage = keyManage;
this.ctx = keyManage.getSSLContext();
//重置socket
if(this.socket != null && !this.socket.isClosed()){
try {
this.socket.close();
socket = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void reset(){
//重置socket
if(this.socket != null && !this.socket.isClosed()){
try {
this.socket.close();
socket = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 连接传输服务器端
*/
public boolean connect(String serverAddress, int port){
reset();
try {
socket = (SSLSocket)ctx.getSocketFactory().createSocket(serverAddress,port);
if (socket == null) {
setLastError("套接字连接失败!");
return false;
}
} catch (Exception e) {
// TODO Auto-generated catch block
setLastError("套接字连接失败!\n"+e.getMessage());
e.printStackTrace();
return false;
}
return true;
}
/**
* 初始化SSL参数
*/
private boolean init(){
try {
ctx = SSLContext.getInstance("SSL");
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
keyStore = KeyStore.getInstance("JKS");
trustKeyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream(keyStoreFile), keyStorePass.toCharArray());
trustKeyStore.load(new FileInputStream(trustKeySoreFile),trustKeyStorePass.toCharArray());
kmf.init(keyStore, keyStorePass.toCharArray());
tmf.init(trustKeyStore);
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
} catch (Exception e) {
// TODO Auto-generated catch block
setLastError(e.getMessage());
e.printStackTrace();
return false;
}
return true;
}
public void closeConnection(){
reset();
}
/**
* 返回SSL套接字
*/
public Socket getSSLSocket(){
return socket;
}
public void setLastError(String error){
lastError = error;
}
public String getLastError(){
return lastError;
}
}
2 冲刺第二天
任务 | 负责人 | 工作量 |
---|---|---|
初步功能整合 | 王鹏宇 | 2 |
初步实现安全证书发放 | 李泽昊 | 2 |
初步实现多线程实现 | 李烨龙 | 2 |
初步实现加密传输实现 | 刘新宇 | 2 |
3 明日任务安排
任务 | 负责人 | 工作量 |
---|---|---|
进一步功能整合 | 王鹏宇 | 3 |
完善安全证书发放功能 | 李泽昊 | 3 |
完善多线程 | 李烨龙 | 3 |
完善加密传输功能 | 刘新宇 | 3 |