201521123006 《java程序设计》 第13周学习总结

1. 本周学习总结

**1.以你喜欢的方式(思维导图、OneNote或其他)归纳总结多网络相关内容。 **

2. 书面作业

**1. 网络基础 **

**1.1 比较ping www.baidu.comping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? **

不同在于:

  • 他们的IP不同,ping www.baidu.com为:163.177.151.110;ping cec.jmu.edu.cn为:210.34.128.152。
  • 完成一次网络交互的时间不同,ping www.baidu.com为:19ms完成一次网络交互;ping cec.jmu.edu.cn为:小于等于1ms完成一次网络交互。
  • TTL的值不同,ping www.baidu.com为:51,中间经过了13个网络设备;ping www.baidu.com为:61,表示中间经过了3个网络设备。
  • 返还行程的时间不同,ping www.baidu.com为:最短19ms,最长19ms,平均19ms; ping cec.jmu.edu.cn为:最短0ms,最长1ms,平均0ms。

因为IP地址: 163.177.151.110在广东省广州市 联通,而IP地址:210.34.128.152在福建省厦门市 教育网。而210.34.128.152离我们的距离更近,所以它的速度更快,进过的网络设备更少,本质上是因为他们的IP地址不同。

**1.2 telnet bbs.newsmth.net,上面这条命令连接的是远程主机的什么端口号? **

这条命令连接的是远程主机的23端口号。

**1.3 telnet cec.jmu.edu.cn 80,尝试回答:你从屏幕看到一些什么内容?返回的内容是不是cec.jmu.edu.cn的主页内容?尝试使用GET /index HTTP/1.0命令,会返回什么?详见实验任务书题目1。 **

  • 没有如何结果,所以返回的内容不是cec.jmu.edu.cn的主页内容。

  • 会返回cec.jmu.edu.cn的主页代码。

**1.4 启动ConnectionWatcher, 然后启动若干个可以联网的程序(如QQ, telnet,浏览器等),查看本机上有什么程序联网,使用了什么端口?QQ占用了什么端口和那些远程IP进行交互,这些IP分布地在那里?使用了什么协议进行通信? **

  • 360程序联网,使用了80端口。
  • UC浏览器联网,使用了80端口。
  • 搜狐新闻联网,使用了80端口。

  • QQ使用了80,443端口和那些远程IP进行交互,这些IP分布地:例如:183.61.38.217来自广东省深圳市 电信,110.81.153.148来自福建省泉州市 电信等。使用了TCP协议和UDP协议进行通信。

**1.5 编写网络程序必不可少的几个信息是什么? **

  • 参考:实验任务书-题目1

编写网络程序必不可少的几个信息是:

  • 套接字,即需要掌握和了解应用程序和网络协议的接口。
  • TCP协议和UDP协议的掌握和使用。
  • 以及需要了解IP,端口,域名等基础知识。

**2. 编写TCP客户端程序 **

**2.1 参照SocketTest.java编写一个简单的连接远程服务器小程序Client.java,可以接收并显示服务器发送的信息。启动时需要首先在控制台指定远程主机IP与端口号。(截图,出现自己学号) **

**2.2 将程序中的网址改成bbs.newsmth.net,端口号改为23,再次观察返回结果?尝试执行telnet bbs.newsmth.net 23,对比返回结果。 **

两个返回结果基本上是一致的,只是eclipse上有的字符不能够识别,不能显示出来。

**2.3 将程序中的网址改成cec.jmu.edu.cn,端口号改为80进一步观察返回结果。没有任何返回结果,为什么?怎么操作? **

  • 因为只是输入了网址和端口号,并没有使用GET / HTTP/1.0发出读取请求,来获得此网页的数据,所以没有任何返回结果。
  • 再添上GET / HTTP/1.0就行了。

**2.4 启动网络调试助手,将其设置为TCP Server,并启动,如下图所示 **

**尝试使用Client.java连接该TCP Server,使用该服务器向Client发送信息。(截图) **

**2.5 回答:现在的Client.java只能接收信息,能否改造Client.java使其可以与服务器进行交互(服务器可以发送信息给Client,Client也可发送信息给服务器),写出大概思路即可。 **

使用Socket中的getOutputStream类,并对其进行包装,可以使用PrintWriter类,因为其输出的是字符文本。并且是从客户端输入到服务器端,所以我们就可以使用Scanner类,在控制台输入,并使用println输出到服务器端。最后因为PrintWriter类有使用到缓冲区,这时就需要我们使用flush()释放缓冲区。

**2.6 选做:实现2.5 **

  • 参考:实验任务书-题目2

**3. ServerSocket与TCP服务器 **

**3.1 简易单线程MenuServer,题目3.1-3.4。(关键代码及运行截图,包含学号)可以使用网络调试助手,将其设置为TCP Client(IP与端口填你的MenuServer的IP与端口),连接你的MenuServer。其中的文件搜索功能为选做。 **

**3.2 多线程MenuServer(截图证明你这个是多线程服务器,使用telnet连接)。 **

**3.3 选做:图形界面的MenuServer **

  • 可以控制服务器的启动停止、查看客户端链接的基本信息(IP、端口、链接时间)
  • 拓展:在服务器端断开某个客户端的链接、查看客户端发送的给服务器端的日志记录
  • 参考:实验任务书-题目3
  • 参考:EchoServer.java,ThreadedEchoServer.java (多线程服务器)

**4. UDP服务器 **

**4.1 改造3.1或3.2,将其改造成基于UDP的MenuServer。(运行界面代码截图,包含学号)。可以使用网络调试助手,将其设置为UDP,要填本机IP与端口也要填远程服务器的IP与端口。 **

  • 参考:UDPServer.java

**5.论述题: 网络程序与流 **

**5.1 前面编写的程序用到了大量的流的相关知识。简述,编写网络程序时应当选择什么样的流?Java网络编程、流之间的关系。场景如:简单的文字聊天、文件传输、应用层协议服务器,如QQ、聊天室、网络游戏。 **

  • 编写网络程序时应当选择能够进行数据交换的流或者是与程序相关的流。例如:当我们进行简单的文字聊天时,我们应该选择输入流和输出流对我们之间的交流文字进行交换,已达到我们之间能够进行交流的目的。此时的输入流和输出流是字节流,再用字符流包装。
  • Java网络编程、流之间的关系:例如:我们使用java进行客户端的编程,我们使用Socket套接字建立客户端对象,当客户端对象建立后,则完成了客户端编程的第一步,紧接着的步骤就是按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。所以,我们可以认为流是用来解决java网络编程中的数据交换问题的,用来进行网络数据交换。

**6. 代码阅读 **

阅读ServerAndThread目录中的源代码 **

**6.1 修改程序,在GUI界面中某个地方显示自己的学号,然后运行该程序(截图、出现学号)。简述这个程序的主要功能。 **

这个程序的主要功能就是服务端和客户端之间的交流或者说是他俩之间的通信。

**6.2 画出源代码的结构图(各个类的依赖关系)。并简要说明各个类的功能。 **

功能
ServerChart 设置服务端的显示界面
ServerReadThread 服务端读取线程
SeverActionListener 监听服务端
MainThread 建立连接;监听到客户端连接后,把线程放到列表中;服务端读取线程
ClientChart 设置客户端的显示界面
ClientReadThread 客户端读取线程
ClientListener 监听客户端

**6.3 简述这个程序有什么不足之处及改进方法. **

  • 不足之处:客户端发送到服务器的消息并不能区分出是哪个服务器发的。服务器发送的消息不能够换行,会和下一则客户端消息合并到一起。
  • 改进方法:如果信息中不包含标记的字符串就加上“服务端说:”,这样就可以区分哪个是服务端发的了。在服务端显示消息的那行代码上添上换行符就行了。

**选做:7. 网络爬虫 **

**使用Socket、URL、正则表达式、流等编写一个网络爬虫可以将cec.jmu.edu.cn及其所包含链接上的所有网址的图片都下载下来,抓取深到不超过5。 **

**选做:8. 简易搜索引擎(进阶) **

**8.1 写出设计思路即可。该搜索引擎包含几部分?里面核心的实现思路?如果能用框架图、流程图画出架构 **

**8.2 以计算机学院网站为例,进行测试。比如,输入ACM后搜索,可以将包含ACM的的网页抽取出来。(可作为课程设计题目) **

3. 码云

**3.1 码云代码提交记录 **

  • 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

4. 课外阅读

**4.1 Java Tutorial:Custom Networking **

**Trail: Custom Networking **

**主要看Overview of Networking,Working With URLs,All About Sockets,All About Datagrams **

  • Overview of Networking:其有两部分,首先,描述了Java平台的网络功能,其次我们需要了解如何使用URLs,sockets和datagrams。我们从网络中下载applet,此时运行的程序中引用了一个特殊的标记——一个HTML文件的标签。applet可以定位在任何地方,浏览器通过解码标签来定位applet并运行它。在java程序中,我们可以使用URL来引用,甚至是连接网络上的资源。电脑在互联网上的交互使用传输控制协议(TCP)和用户数据报协议(UDP),TCP是需要建立连接的,它是可靠的,有序的,例如:HTTP,FTP,Telnet都是基于TCP的常用应用,而UDP则不需要建立连接,它提高了通信不保证网络。一般来说,一台电脑只有一个物理连接到网络,这时候我们就需要使用端口来区别数据属于计算机中的那个程序。在java车程序中,我们一般通过类java.net使得Java程序可以使用TCP或UDP在互联网上进行交流。

  • Working With URLs: URL是统一资源定位符的缩写,它可以指在Java程序中的一个网络地址或一个URL对象。网址是指一个URL的字符串描述如何在互联网上找到一个资源,其有两个主要组件:协议标识符和资源名称。当我们需要在java程序中创建一个URL对象时,我们可以使用URL myURL = new URL("http://example.com/");来创建,其代表了一个绝对URL,会抛出MalformedURLException异常。一些URL地址有可能会包含特殊字符,例如空格字符:http://example.com/hello world/,使用URL:URL url = new URL("http://example.com/hello%20world");,一个空格符会需要几个符号来表示,很不方便,这时候就需要使用java.net.URI类,URI uri = new URI("http", "example.com", "/hello world/", "");,然后将URI转为URL:URL url = uri.toURL();

  • URL的一些方法:

  • getProtocol
        返回URL的协议名称。
    getAuthority
        返回URL的授权部分。
    getHost
        返回URL的主机名称。
    getPort
        返回URL的端口号。getPort方法返回端口号。如果未设置端口,getPort返回-1。
    getPath
        返回URL的路径部分。
    getQuery
        返回URL的查询部分。
    getFile
        返回此URL的文件名。返回的文件部分将与getPath()相同,再加上getQuery()值的规范化形式(如果有)。如果没有查询部分,此方法和getPath()将返回相同的结果。
    getRef
        返回URL的锚点(也称为“引用”)。
    
    • All About Sockets:socket是在网络上进行双向沟通的两个程序的一个端点。socket类是用于表示客户端程序和服务器程序之间的联系。客户端的程序编写:首先,使用一个套接字建立对象;然后使用对应的输入流和输出流;再根据服务器的协议进行读取和写入到流;最后关闭流,关闭套接字。服务器的编程则是使用ServerSocket serverSocket = new ServerSocket(portNumber);建立一个服务器对象,clientSocket = serverSocket.accept();则是等待客户端启动和请求连接这个服务器的主机和端口,建立两者之间的关系。

    • All About Datagrams:datagram是一个独立的、通过网络发送自包含信息的,到达时间和内容是没有保证的。在java.net包中我们可以使用类DatagramSocket,DatagramPacket,MulticastSocket来发送和接受datagram。编写服务器程序是我们可以使用类QuoteServer和类QuoteServerThread。而客户端则是使用类QuoteClient。类MulticastSocket可以使得服务器广播到多个客户端,而不是只有特定额客户端。

    **4.2 HTTP协议简介 **

    • 在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是HTTP。
    • HTML是一种用来定义网页的文本,对于编写网页有很大的帮助或者是作用。
    • HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。
    • GET / HTTP/1.1是用来发出一个读取请求,用来使服务器能够获得此网页的数据,也可以使用GET / HTTP/1.0,只是相对于1.0版本,1.1版本允许多个HTTP请求复用一个TCP连接,传输速度会比1.0版本快。当然,除了GET外,我们还可以使用POST。两者的区别在于:GET仅请求资源,而POST会附带用户数据。
    • Host: www.sina.com.cn是服务器可以通过Host来区分浏览器请求的是哪个网站。
    • HTTP响应分为Header和Body两部分(Body是可选项)。Header:例如:200 OK:200表示一个成功的响应,后面的OK是说明。而失败的响应有404 Not Found:网页不存在,500 Internal Server Error:服务器内部出错。
    • Content-Type: text/html:指示响应的内容。浏览器是依靠Content-Type来判断响应的内容,并不是靠URL来判断响应的内容。
    • HTTP响应的Body就是HTML源码。
    • 每个Header都自成一行,换行符是\r\n。当遇到连续两个\r\n时,则Header部分结束,后面的数据全部是Body,并且其数据类型由Content-Type来确定。
    • 使用了Content-Encoding时,Body数据是被压缩的,这就需要我们先对其进行解压。

    **4.3 一个简单的小爬虫 **

    Java编程技巧:小爬虫程序.docx

    • 使用流进行读取链接文件:reader = new BufferedReader(new InputStreamReader(new FileInputStream(this.fileName)));,再将读取出的数据添加到列表中:lines.add(line).
    • 使用URL来获得所需的链接:URLConnection conn= httpUrl.openConnection();,再获取链接上的输出流,这时候就需要在URL类的基础上使用流:br = new BufferedReader(new InputStreamReader(conn.getInputStream()));,最后,我们想要检查输出流中是否含有标记字符串:
    while ( (line = bis.readLine()) != null) { 
      exist = line.contains(str); 
      if(exist) { 
          break; 
      } 
    }
    
    • 使用流将文件读入程序,并写入列表,为每一个链接开启一个线程:
    FileReader reader = new FileReader("F:/myworkspace/workspace/diggold/src/url.txt"); 
      List urls = reader.getLines(); 
      for (String string : urls) { 
          Url url = new Url(string); 
          Digger digger = new Digger(url); 
          digger.start(); 
      } 
    
    • 然后查看是否有free_msg字段,有就打开链接:
    if(url.isExist("free_msg"))
        Runtime.getRuntime().exec("C:/Program Files/Internet Explorer/iexplore.exe " + url.getUrl()); 
    

    **4.4 进阶:HTTPComponent的使用 **

    **使用java中的Socket、URL、URLConnection,然后遵循HTTP协议也可以编写一个小程序,和可以查询成绩的HTTP服务器进行交流。然而直接使用Socket编程较麻烦,这时候我们可以使用HTTPComponent。

    HTTPComponent相比传统JDK自带的URLConnection,增加了易用性和灵活性 **

    **1. 阅读HttpClient 教程,使用HTTPComponent编写一些与HTTP服务器交换的示例程序 **

    **2. 选做:使用HTTPComponent开发一个查询成绩的程序:用户输入用户名、密码、验证码,即可自动查询教务处服务器,获取成绩。 **

    • 参考资料:用Java的HttpClient写一个简单的http请求和返回,HttpClient使用详解,HttpClient 教程, HTTP Client官网

posted @ 2017-05-21 15:15  HeeCHUL  阅读(396)  评论(1编辑  收藏  举报