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


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

    教材学习内容总结

    学习目标

    • 了解计算机网络基础

    OSI分层(7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

    1 物理层:RJ45、CLOCK、IEEE802.3 (中继器,集线器,网关)

    2 数据链路:PPP、FR、HDLC、VLAN、MAC (网桥,交换机)

    3 网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)

    4 传输层:TCP、UDP、SPX

    5 会话层:NFS、SQL、NETBIOS、RPC

    6 表示层:JPEG、MPEG、ASII

    7 应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS

    通常OSI参考模型第一层到第三层称为底层(lower layer),又叫介质层(media layer),底层负责数据在网络中的传送,网络互连设备往往位于下三层,以硬件和软件的方式来实现。OSI参考模型的第五层到第七层称为高层(upper layer),又叫住几层(host layer),高层用于保障数据的正确传输,以软件方式来实现。

    • 掌握Ja Socket编程
    InetAddress

    //获取本机的InetAddress实例
    InetAddress address =InetAddress.getLocalHost();
    address.getHostName();//获取计算机名
    address.getHostAddress();//获取IP地址
    byte[] bytes = address.getAddress();//获取字节数组形式的IP地址,以点分隔的四部分

    //获取其他主机的InetAddress实例
    InetAddress address2 =InetAddress.getByName("其他主机名");
    InetAddress address3 =InetAddress.getByName("IP地址");

    URL类
    • URL(Uniform Resource Locator)统一资源定位符,表示Internet上某一资源的地址,协议名:资源名称
    • //创建一个URL的实例
      URL baidu =new URL("http://www.baidu.com");
      URL url =new URL(baidu,"/index.html?username=tom#test");//?表示参数,#表示锚点
      url.getProtocol();//获取协议
      url.getHost();//获取主机
      url.getPort();//如果没有指定端口号,根据协议不同使用默认端口。此时getPort()方法的返回值为 -1
      url.getPath();//获取文件路径
      url.getFile();//文件名,包括文件路径+参数
      url.getRef();//相对路径,就是锚点,即#号后面的内容
      url.getQuery();//查询字符串,即参数
    TCP编程
    • TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低
    • Java中基于TCP协议实现网络通信的类
      客户端的Socket类
      服务器端的ServerSocket类
    • Socket通信的步骤
      ① 创建ServerSocket和Socket
      ② 打开连接到Socket的输入/输出流
      ③ 按照协议对Socket进行读/写操作④ 关闭输入输出流、关闭Socket
    • 服务器端:
      ① 创建ServerSocket对象,绑定监听端口
      ② 通过accept()方法监听客户端请求
      ③ 连接建立后,通过输入流读取客户端发送的请求信息
      ④ 通过输出流向客户端发送乡音信息
      ⑤ 关闭相关资源
    • /**
    • 基于TCP协议的Socket通信,实现用户登录,服务端
      */
    • //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
      ServerSocket serverSocket =newServerSocket(10086);//1024-65535的某个端口

    • //2、调用accept()方法开始监听,等待客户端的连接
      Socket socket = serverSocket.accept();

    • //3、获取输入流,并读取客户端信息
      InputStream is = socket.getInputStream();
      InputStreamReader isr =newInputStreamReader(is);
      BufferedReader br =newBufferedReader(isr);
      String info =null;
      while((info=br.readLine())!=null){
      System.out.println("我是服务器,客户端说:"+info);
      }
      socket.shutdownInput();//关闭输入流

    • //4、获取输出流,响应客户端的请求
      OutputStream os = socket.getOutputStream();
      PrintWriter pw = new PrintWriter(os);
      pw.write("欢迎您!");
      pw.flush();

    • //5、关闭资源
      pw.close();
      os.close();
      br.close();
      isr.close();
      is.close();
      socket.close();
      serverSocket.close();

    • 客户端:

      ① 创建Socket对象,指明需要连接的服务器的地址和端口号
      ② 连接建立后,通过输出流想服务器端发送请求信息
      ③ 通过输入流获取服务器响应的信息
      ④ 关闭响应资源

    • 理解混合密码系统

    • 掌握Java 密码技术相关API的使用
      //客户端

    • //1、创建客户端Socket,指定服务器地址和端口
      Socket socket =newSocket("localhost",10086);

    • //2、获取输出流,向服务器端发送信息
      OutputStream os = socket.getOutputStream();//字节输出流
      PrintWriter pw =newPrintWriter(os);//将输出流包装成打印流
      pw.write("用户名:admin;密码:123");
      pw.flush();
      socket.shutdownOutput();

    • //3、获取输入流,并读取服务器端的响应信息
      InputStream is = socket.getInputStream();
      BufferedReader br = new BufferedReader(new InputStreamReader(is));
      String info = null;
      while((info=br.readLine())!null){
      System.out.println("我是客户端,服务器说:"+info);
      }

    • //4、关闭资源
      br.close();
      is.close();
      pw.close();
      os.close();
      socket.close();

    • 应用多线程实现服务器与多客户端之间的通信

    ① 服务器端创建ServerSocket,循环调用accept()等待客户端连接
    ② 客户端创建一个socket并请求和服务器端连接
    ③ 服务器端接受苦读段请求,创建socket与该客户建立专线连接
    ④ 建立连接的两个socket在一个单独的线程上对话
    ⑤ 服务器端继续等待新的连接

    • /服务器线程处理

    • //和本线程相关的socket
      Socket socket =null;

    • //
      public serverThread(Socket socket){
      this.socket = socket;
      }

        publicvoid run(){服务器处理代码
        }
      

    //============================================

    • //服务器代码
      ServerSocket serverSocket =newServerSocket(10086);
      Socket socket =null;
      int count =0;//记录客户端的数量
      while(true){
      socket = serverScoket.accept();
      ServerThread serverThread =newServerThread(socket);
      serverThread.start();
      count++;
      System.out.println("客户端连接的数量:"+count);
      }

    教材学习中的问题和解决过程

    教材学习有问题先去https://shimo.im/doc/1i1gldfsojIFH8Ip/看看,如果别人没有提出相同问题,可以编辑文档添加,然后把自己提出的问题复制到下面:

    • 问题1:多线程的优先级问题
    • 问题1解决方案:可适当的降低优先级,否侧可能会有程序运行效率低的情况
    • 问题2:是否关闭输出流和输入流
    • 问题2解决方案:对于同一个socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭,所以一般不用关闭流,直接关闭socket即可
    • ...

    代码调试中的问题和解决过程

    教材中代码调试有问题先去https://shimo.im/doc/1i1gldfsojIFH8Ip/看看,如果别人没有提出相同问题,可以编辑文档添加,然后把自己提出的问题复制到下面:

    • 问题1:XXXXXX
    • 问题1解决方案:XXXXXX
    • 问题2:XXXXXX
    • 问题2解决方案:XXXXXX
    • ...

    代码托管

    (statistics.sh脚本的运行结果截图)

    上周考试错题总结

    结对及互评

    我与20155327李百乾结对学习,在一起学习的时间甚少,没有过多评论。

    评分标准

    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

    • 参考示例

    点评过的同学博客和代码

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

    这两周在补书上代码,一个一个的敲,枯燥无味,在敲代码的过程中虽然发现了一些问题,也学习到很多。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 3000行 30篇 400小时
    第十周 200/200 15/30 19/211

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    • 计划学习时间:14小时

    • 实际学习时间:19小时

    • 改进情况:

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    python读取xml文件报错ValueError: multi-byte encodings are not supported
    使用命令创建jenkins的job,解决jenkinsapi.custom_exceptions.JenkinsAPIException错误
    使用Python命令创建jenkins的job
    使用selenium grid分布式执行之一
    使用python 操作liunx的svn,方案二
    使用python 操作liunx的svn,方案一
    使用shell脚本实现在liunx上进行svn的上传下载更新功能
    java连接ssh执行shell脚本
    perl学习(二)正则表达式
    googletest进行单元测试(使用cmake编译)
  • 原文地址:https://www.cnblogs.com/hpl20155329/p/6790597.html
Copyright © 2020-2023  润新知