接下来是客户端类CoderClient的编写。
1.首先配置如下信息,包括服务器地址、端口、密钥文件位置.
conf.properties
#configure private key on server rsa_private=d:/rsa1_private.key #public key from client rsa_public=d:/rsa_public.key #server server=127.0.0.1 #server port port=888
2.编写发送文件的方法,其中byte[] buf=new byte[117]的原因是RSA加密算法支持的最大字节数为117,而加密后变成128位,所以服务器端解密的时候可以使用128bytes的buf读取文件。
public boolean send(String filename){ try { File f = new File(filename); fis = new FileInputStream(filename); byte[] buf = new byte[117]; int available; socket = new Socket(server,port); os = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); dos.writeUTF(f.getName()); //写入文件名 dos.writeLong(f.length()); //写入文件大小 while((available = fis.read(buf)) != -1){ byte[] availableBytes = null; if(available == buf.length){ availableBytes = buf; }else{ availableBytes = new byte[available]; for (int i = 0; i < available; i++) { availableBytes[i] = (byte) buf[i]; } } byte[] cipherText = coder.encrypt(availableBytes); byte[] signature = sign.getSignature(cipherText); os.write(signature); os.write(cipherText); //count += cipherText.length; //System.out.println("send "+count+" bytes"); } socket.shutdownOutput(); fis.close(); return true; } catch (FileNotFoundException e) { log.error("文件"+filename+" 未找到"); } catch (UnknownHostException e) { log.error("未知主机:"+server); } catch (IOException e) { log.error("文件读/写错误,可能是因为远程主机无响应"); } return false; }
3.为了测试多线程处理效果,可以将客户端继承于Thread,在重写的run方法中调用 send(String file)方法
@Override public void run() { send(this.file); }
4.main中的测试可以这样来模拟多个客户端同时向服务器传输文件
File dir = new File("E://files//demo//"); File[] files = dir.listFiles(); for(int i=0; i<files.length; i++){ Thread th = new Thread(new CoderClient(files[i].getAbsolutePath())); th.start(); }
本文介绍了一个使用RSA加密算法实现的安全文件传输客户端。该客户端能够配置服务器地址、端口及密钥,并通过多线程方式同时向服务器传输多个文件。
1111

被折叠的 条评论
为什么被折叠?



