20155302 2016-2017-2 《Java程序设计》第十周学习总结

20155302 2016-2017-2 《Java程序设计》第十周学习总结

教材学习内容总结

  • 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。

  • 网络最主要的优势在于共享:共享设备和数据,现在共享设备最常见的是打印机。共享数据就是将大量的数据存储在一组机器中,其它的计算机通过网络访问这些数据。

  • 在现有的网络中,网络通讯的方式主要有两种:

①TCP(传输控制协议)方式

②UDP(用户数据报协议)方式

  • 由于IP地址不容易记忆,所以为了方便记忆,有创造了另外一个概念——域名(Domain Name)。一个IP地址可以对应多个域名,一个域名只能对应一个IP地址。

  • 网络编程中的两种程序就分别是客户端和服务器端。这种网络编程的结构被称作客户端/服务器结构,也叫做Client/Server结构,简称C/S结构;使用浏览器作为客户端的结构被称作浏览器/服务器结构,也叫做Browser/Server结构,简称为B/S结构。总之C/S结构和B/S结构是现在网络编程中常见的两种结构,B/S结构其实也就是一种特殊的C/S结构。P2P程序中既包含客户端程序,也包含服务器端程序。

  • 网络通讯的方式主要有两种: 在网络通讯中,TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。而UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。由于TCP需要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP方式的速度稍微慢一些,而且传输时产生的数据量要比UDP稍微大一些。论使用TCP方式还是UDP方式进行网络通讯,网络编程都是由客户端和服务器端组成。

  • 客户端一般实现程序界面和基本逻辑实现,客户端的编程主要由三个步骤实现:

1.建立网络连接:在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。

2.交换数据:交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。

3.关闭网络连接:在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。

  • 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。

  • 实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现,分别是:

①DatagramSocket:实现“网络连接”,包括客户端网络连接和服务器端网络连接。DatagramSocket实现的就是发送数据时的发射器,以及接收数据时的监听器的角色。类比于TCP中的网络连接,该类既可以用于实现客户端连接,也可以用于实现服务器端连接。

②DatagramPacket:实现对于网络中传输的数据封装,该类的对象代表网络中交换的数据。在UDP方式的网络编程中,无论是需要发送的数据还是需要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。和TCP方式的网络传输相比,IO编程在UDP方式的网络编程中变得不是必须的内容,结构也要比TCP方式的网络编程简单一些。

  • 凯撒密码

      public static void main(String args[]) throws Exception{
      String s=args[0];
              int key=Integer.parseInt(args[1]);
              String es="";
              for(int i=0;i<s.length( );i++)
      {  char c=s.charAt(i);
                     if(c>='a' && c<='z') // 是小写字母
                        { c+=key%26;  //移动key%26位
                          if(c<'a') c+=26;  //向左超界
                          if(c>'z') c-=26;  //向右超界
                        }
                     else if(c>='A' && c<='Z') // 是大写字母
      {  c+=key%26;
                          if(c<'A') c+=26;
                          if(c>'Z') c-=26;
                        }
                     es+=c;
                 }
             System.out.println(es);
           }
    
  • DES算法

      import java.io.*;
      import javax.crypto.*;
      public class Skey_DES{ 
       public static void main(String args[])
       throws Exception{ 
      KeyGenerator kg=KeyGenerator.getInstance("DESede");
                  kg.init(168); 
                  SecretKey k=kg.generateKey( );
                  FileOutputStream  f=new FileOutputStream("key1.dat");
                  ObjectOutputStream b=new  ObjectOutputStream(f);
                  b.writeObject(k);
               }
      }
    
  • RSA算法

      import java.io.*;
      import java.security.*;
      import javax.crypto.*;
      import javax.crypto.spec.*;
      
      public class Skey_RSA{
         public static void main(String args[]) throws Exception{
              KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
              kpg.initialize(1024);
              KeyPair kp=kpg.genKeyPair();
              PublicKey pbkey=kp.getPublic();
              PrivateKey prkey=kp.getPrivate();
              //  保存公钥        
              FileOutputStream  f1=new FileOutputStream("Skey_RSA_pub.dat");
              ObjectOutputStream b1=new  ObjectOutputStream(f1);
      b1.writeObject(pbkey);
              //  保存私钥
              FileOutputStream  f2=new FileOutputStream("Skey_RSA_priv.dat");
              ObjectOutputStream b2=new  ObjectOutputStream(f2);
      b2.writeObject(prkey);
         }
      }
    
  • MD5

      import java.security.*;
      public class DigestPass{
           public static void main(String args[ ]) throws Exception{
               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. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)

    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

  4. 代码调试中的问题和解决过程, 一个问题加1分

  5. 本周有效代码超过300分行的(加2分)

    • 一周提交次数少于20次的不加分
  6. 其他加分:

    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分
  7. 扣分:

    • 有抄袭的扣至0分
    • 代码作弊的扣至0分
    • 迟交作业的扣至0分

点评模板:

  • 博客中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

  • 参考示例

点评过的同学博客和代码

其他(感悟、思考等,可选)

本周学习的知识很复杂难懂,而且需要和之前学习的内容基础结合起来,所以前面的基础很重要,在学习过程中我不断翻阅前面知识,结合起来学习会使效率提高。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 20/20 2/2 20/20
第二周 140/160 2/4 18/38
第三周 113/273 1/5 20/58
第四周 335/608 1/6 20/78
第五周 1159/1408 1/7 30/108
第六周 452/1860 1/8 20/128
第七周 343/2203 1/9 30/158
第八周 448/2651 1/10 20/178
第九周 516/3167 1/11 20/198
第十周 367/3534 1/12 20/218
posted @ 2017-04-27 20:07  乐舞歌不是可爱送  阅读(172)  评论(1编辑  收藏  举报
Live2D