由于在以前的结对编程中已经实现了这两个功能,而且老师说能够直接使用,我就直接使用了以前的InfixToSuffix
类和Calculator
类进行中缀转后缀和计算,在ArithmeticTest
类中添加代码后实现。html
TCP协议java
Java.net.Socketgit
SocketImpl
类的实例执行。应用程序经过更改建立套接字实现的套接字工厂能够配置它自身,以建立适合本地防火墙的套接字。java.net
中提供了两个类Socket
和ServerSocket
,分别用来表示双向链接的客户端和服务端。这是两个封装得很是好的类,使用很方便。Socket client = new Socket("127.0.01.", 80); ServerSocket server = new ServerSocket(80);
ipconfig
在cmd中查看本身的IP地址,要注意的是,在建立Socket的时候,若是是和结对伙伴的话,host
要填结对伙伴的IP,而若是是本身既作客户端又作服务器时,host
能够填127.0.0.1或localhost。//1.创建客户端Socket链接,指定服务器位置和端口 Socket socket = new Socket("172.16.43.217",8800);
//2.获得socket读写流 OutputStream outputStream = socket.getOutputStream(); PrintWriter(outputStream); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); //输入流 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
Scanner scanner = new Scanner(System.in); System.out.println("请输入计算式:(以空格隔开每一个运算符和运算数)"); String expr = scanner.nextLine(); InfixToSuffix infixToSuffix = new InfixToSuffix(); infixToSuffix.conversion(expr); System.out.println("我传送给服务器的信息为:"+infixToSuffix.getMessage()); String info = new String(infixToSuffix.getMessage().getBytes("utf-8")); outputStreamWriter.write(info); outputStreamWriter.flush(); socket.shutdownOutput(); //接收服务器的响应 String reply = null; while (!((reply = bufferedReader.readLine()) == null)){ System.out.println("接收服务器的信息为:" + reply); }
bufferedReader.close(); inputStream.close(); outputStreamWriter.close(); outputStream.close(); socket.close();
DES加密算法算法
FileInputStream f=new FileInputStream("key1.dat"); ObjectInputStream b=new ObjectInputStream(f); Key k=(Key)b.readObject( ); Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.ENCRYPT_MODE, k); byte ptext[]=s.getBytes("UTF8"); for(int i=0;i<ptext.length;i++){ System.out.print(ptext[i]+","); } System.out.println(""); byte ctext[]=cp.doFinal(ptext); for(int i=0;i<ctext.length;i++){ System.out.print(ctext[i] +","); } FileOutputStream f2=new FileOutputStream("SEnc.dat"); f2.write(ctext);
DataOutputStream/DataInputStream
,其中有一个方法叫wrtieUTF
,它将 UTF-8 字符串写入字节流。先写入以字节表示的 UTF-8 字符串长度(做为 16 位整数),而后写入表示字符串字符的字节。使用这个方法,在传输以后转化成byte数组就很方便了。
DH算法编程
key_DH
类和keyAgree
类中的main方法,使其可以被引用。
String x=args[0]; MessageDigest m=MessageDigest.getInstance("MD5"); m.update(x.getBytes("UTF8")); byte s[ ]=m.digest( ); String result=""; for (int i=0; i<s.length; i++){ result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6); } System.out.println(result);
在任务四的代码基础上将运行代码加入便可。数组
问题1解决方法:经过在网上查找发现这个错误好像是避免不了的,必须进行捕获或者抛出。服务器
在建立socket时若是发生错误,将产生IOException,在程序中必须对之做出处理。因此在建立Socket或ServerSocket是必须捕获或抛出例外。网络
javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
问题3解决方法:在刚刚的任务三的实验过程当中有写到,咱们找到了另一种方法来解决这个问题。数据结构
本学期的最后一次实验了,感受java socket真的很是有意思,最后悔的是当时实验三的最后一个节点作的不是很好,因此这回又去复习了半天密码学的相关内容。
回顾一个学期的内容发现本身真的学到了不少,很开心。socket
下学期继续加油。