冲刺DAY3
1 今日任务完成情况
1.1功能整合与GUI界面的优化
改善了各个函数之间的调用关系,整理了登录注册页面与主页面之间的优先级顺序,进一步对功能进行整合。
1.2 完善安全证书发放功能
在昨天的安全证书发放基础上,继续进行完善和修改。
今天生成了测试需要的证书,设置了初始密码。
1.3 完善加密传输功能
在昨天实现SSL的基础上进一步实现了文件的传输。
文件发送部分代码:
public FileSender(){
}
public void setSocket(Socket socket){
if(this.socket != null && !this.socket.isClosed()){
try {
this.socket.close();
socket = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.socket = socket;
if(socket != null){
try {
inputStream = this.socket.getInputStream();
outputStream = this.socket.getOutputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
printWriter = null;
reader = null;
}
/**
* 发送指定文件
* @param filePath 带路径的文件名
* @return
*/
public boolean sendFile(String filePath){
File file = new File(filePath);
if(!file.exists()){
setLastError("文件不存在!");
return false;
}
//1。向接收端说hello
if(!sayHello()){
setLastError("SayHello Error\n" + getLastError());
return false;
}
//2.向接收端发送文件名
if(!sendFileName(file.getName())){
setLastError("发送文件名出错");
return false;
}
//3.向接收端发送文件长度
if(!sendFileLength(file.length())){
setLastError("发送文件长度出错");
return false;
}
//4.向接收端发送文件二进制数据
if(!sendFileBody(file, file.length())){
setLastError("发送文件体出错!");
return false;
}
// 5.向接收端发送文件摘要
if (!sendFileDigest(file)) {
setLastError("发送文件摘要失败或文件被修改!");
return false;
}
return true;
}
/**
* 向接收端sayHello
* @return
*/
private boolean sayHello(){
writeMessage(HELLO);
String result = readMessage();
if(isResultSuccess(result)){
return true;
}
return false;
}
/**
* 向接收端发送文件名
* @param fileName
* @return
*/
private boolean sendFileName(String fileName){
writeMessage("filename:"+fileName);
return isResultSuccess(readMessage());
}
/**
* 向接收端发送文件长度
* @param fileLength
* @return
*/
private boolean sendFileLength(long fileLength){
writeMessage("filelength:" + String.valueOf(fileLength));
return isResultSuccess(readMessage());
}
/**
* 发送文件体
* @param filePath
* @return
*/
private boolean sendFileBody(File file,long length){
try {
if(length == 0){
length = file.length();
}
FileInputStream fileInputStream = new FileInputStream(file);
writeBinaryData(fileInputStream, length);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
/**
* 发送文件摘要
*
* @param file
* @return
* @throws IOException
*/
private boolean sendFileDigest(File file) {
try {
writeMessage(fileDigest(file, "MD5"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return isResultSuccess(readMessage());
}
/**
* 从输入流读取一条消息
* @return
*/
private String readMessage(){
String result = "";
if(reader == null){
reader = new InputStreamReader(inputStream);
}
StringBuffer buffer = new StringBuffer();
char tmp;
try {
while((tmp = (char)reader.read()) > 0 && tmp!='\n'){
buffer.append(tmp);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(e.getMessage().contains("No trusted certificate found")){
setLastError("对方证书不受信任!");
}
}
result = buffer.toString();
System.out.println("返回:" +result);
return result;
}
/**
* 输出一条消息
* @param message
*/
private void writeMessage(String message){
if(printWriter == null){
printWriter = new PrintWriter(outputStream);
}
printWriter.write(message);
printWriter.write('\n');
printWriter.flush();
System.out.println("发送:" + message);
}
/**
* 传输二进制数据
* @param sourceInputStream 数据源
* @param length 要传输的数据长度
*/
private void writeBinaryData(InputStream sourceInputStream,long length){
byte[] buffer = new byte[1024];
long count = 0;
int tmp;
try {
while(((tmp = sourceInputStream.read(buffer)) > 0) && count < length){
if(count + tmp >length){
tmp = (int)(length - count);
}
outputStream.write(buffer, 0, tmp);
count += tmp;
}
System.out.println("文件发送完毕!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 接收指定长度的二进制数据
* @param destOutputStream
* @param length
*/
private void readBinaryData(OutputStream destOutputStream,int length){
byte[] buffer = new byte[1024];
int count = 0;
int tmp;
try {
while(count < length &&(tmp = inputStream.read(buffer)) > 0){
if(count + tmp >length){
tmp = length -count;
}
destOutputStream.write(buffer, 0, tmp);
count += tmp;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获取文件摘要
* @param file
* @param md
* @return
* @throws IOException
*/
private String fileDigest(File file, String md) throws IOException {
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance(md);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
InputStream in = new BufferedInputStream(new FileInputStream(file));
int ch;
while ((ch = in.read()) != -1) {
// 用指定字节更新摘要
digest.update((byte) ch);
}
in.close();
// 完成散列摘要计算
byte[] hash = digest.digest();
return byteToString(hash);
}
/**
* 字符数组转换为字符串
*
* @param in
* @return
* @throws Exception
*/
private String byteToString(byte[] scoure) {
StringBuilder builder = new StringBuilder();
for (byte c : scoure) {
builder.append((int) c);
}
return builder.toString();
}
/**
* 判断返回结果是否为成功
*
* @param result
* @return
*/
private boolean isResultSuccess(String result){
return result.contains(SUCCESS_CODE);
}
public void setLastError(String error){
this.lastError = error;
}
public String getLastError(){
return lastError;
}
}
其余代码已经托管到github。
2 冲刺第二天
任务 | 负责人 | 工作量 |
---|---|---|
进一步功能整合 | 王鹏宇 | 3 |
完善安全证书发放功能 | 李泽昊 | 3 |
完善多线程 | 李烨龙 | 3 |
完善加密传输功能 | 刘新宇 | 3 |
3 明日任务安排
任务 | 负责人 | 工作量 |
---|---|---|
进一步功能整合 | 王鹏宇 | 3 |
完善安全证书功能 | 李泽昊 | 3 |
完善多线程 | 李烨龙 | 3 |
完善加密传输功能 | 刘新宇 | 3 |