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

1. 本周学习总结

1.以你喜欢的方式(思惟导图、OneNote或其余)概括总结多网络相关内容。

2. 书面做业

1. 网络基础

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

不一样在于:javascript

  • 他们的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地址不一样。html

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

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

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 xwp 阅读( ...) 评论( ...) 编辑 收藏
    markdown

相关文章
相关标签/搜索