201521123091 《Java程序设计》第13周学习总结
Java 第十三周总结
第十三周的作业。
目录
1.本章学习总结
2.Java Q&A
3.码云上代码提交记录及PTA实验总结
4.课后阅读
1.本章学习总结
1.1 以你喜欢的方式(思维导图、OneNote或其他)归纳总结网络相关内容。
下文来自与Java核心技术,有很多零散的知识点:
- 连接到服务器:运行在远程计算机上的服务器软件不停地等待那些希望与相应端口连接的网络请求。当远程计算机上的操作系统接收到一个请求与相应端口连接的网络数据包时,它便唤醒正在监听网络连接请求的服务器进程,并为两者建立连接。这种连接还一直保持下去,直到被其中任何一方中止。
- GET / HTTP/1.0可以返回一个HTML格式的文本页,与Web浏览器访问某个网页所经历的过程是完全一致的,它是用HTTP从服务器请求Web页面。
- 套接字是网络软件中的一个抽象概念,负责使能该程序内部和外部之间的通信。
- Java平台还支持所谓的UDP(用户数据报协议),该协议可以用于发送数据包,它所需付出的开销要比TCP少得多。UDP还有一个重要的缺点:数据包无需按照顺序进行传递,它们甚至可能在传输过程中全部丢失。
- 因特网地址是指用一串数字表示的主机地址,它由4个字节组成,IPv6规定为16个字节。一些访问量较大的主机名通常会对应于多个因特网地址,以实现负载均衡。
- 服务器发送给服务器输出流的所有信息都会成为客户端程序的输入,同时来自客户端程序的所有输出都会被包含在服务器输入流中。
- URL(统一资源定位符),URI(统一资源标识符),URN(统一资源名称),URI是个纯粹的句法结构,用于指定标识Web资源的字符串的各个不同部分。URL是URI的一个特例,它包含了用于定位Web资源的足够信息。其他URI则不属于定位符,因为根据该标识符我们无法定位任何数据,也称之为URN。
2.Java Q&A
1. 网络基础
1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同?
耗时不同,因为210.34.128.152在福建厦门,上图183.232.231.173在广东广州,距离近,耗时短。
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.4 启动ConnectionWatcher, 然后启动若干个可以联网的程序(如QQ, telnet,浏览器等),查看本机上有什么程序联网,使用了什么端口?QQ占用了什么端口和那些远程IP进行交互,这些IP分布地在那里?使用了什么协议进行通信?
QQ 使用8080端口 183.192.196.210来自上海市上海市 移动
8080端口同80端口,是被用于WWW代理服务的,可以实现网页浏览,经常在访问某个网站或使用代理服务器的时候,会加上“:8080”端口号。
firefox 都是使用80端口
80端口是为HTTP开放的
223.202.6.26来自北京市朝阳区 BGP多线
这个BGP多线??
还有183.250.178.82来自福建省厦门市 移动
虾米音乐 113.18.220.108来自福建省福州市 移动
1.5 编写网络程序必不可少的几个信息是什么?
IP、端口、域名、协议
2. 编写TCP客户端程序
2.1 参照SocketTest.java编写一个简单的连接远程服务器小程序Client.java,可以接收并显示服务器发送的信息。启动时需要首先在控制台指定远程主机IP与端口号。(截图,出现自己学号)
2.2 将程序中的网址改成bbs.newsmth.net,端口号改为23,再次观察返回结果?尝试执行telnet bbs.newsmth.net 23,对比返回结果。
大致相似,就是有些可能是颜色控制符不能解析出来
2.3 将程序中的网址改成cec.jmu.edu.cn,端口号改为80进一步观察返回结果。没有任何返回结果,为什么?怎么操作
因为没有发送get请求获取html文档
一定要再加个newline,因为我们输入GET / HTTP/1.0后,要连续敲两次回车。
2.4 启动网络调试助手,将其设置为TCP Server,并启动,如下图所示
尝试使用Client.java连接该TCP Server,使用该服务器向Client发送信息。
2.1演示过了
2.5 回答:现在的Client.java只能接收信息,能否改造Client.java使其可以与服务器进行交互(服务器可以发送信息给Client,Client也可发送信息给服务器),写出大概思路即可。
启动两个线程,一个线程用来接受信息,一个线程用来发送信息
2.6 选做:实现2.5
忘记加服务器自己发的消息没有在服务器端显示,这个加一句输出就好了。
3. ServerSocket与TCP服务器
3.1 简易单线程MenuServer,题目3.1-3.4。(关键代码及运行截图,包含学号)可以使用网络调试助手,将其设置为TCP Client(IP与端口填你的MenuServer的IP与端口),连接你的MenuServer。其中的文件搜索功能为选做。
3.2 多线程MenuServer。
4. UDP服务器
改造3.1或3.2,将其改造成基于UDP的MenuServer。(运行界面代码截图,包含学号)。可以使用网络调试助手,将其设置为UDP,要填本机IP与端口也要填远程服务器的IP与端口。
5. 论述题:网络程序与流
前面编写的程序用到了大量的流的相关知识。简述,编写网络程序时应当选择什么样的流?Java网络编程、流之间的关系。场景如:简单的文字聊天、文件传输、应用层协议服务器,如QQ、聊天室、网络游戏。
socket的输入输出流是字节流,然后用字符流来包装。
Java网络编程与流之间的关系:
Java programs see network connections as streams of data that can be interpreted and responded to in any way necessary.
比如文件传输:
首先发送端从本地文件系统中读取文件,并且创建和接收端的网络连接,然后发送端提供数据包装器,并且把文件写入这个包装器中,然后写到网络中。接收端建立新文件,连接发送端,通过网络接收到数据并进行解包,将数据写到缓冲区中,最后从缓冲区写到本地新建的文件中去。这其中数据都是以字节流的形式来保存的。
6. 代码阅读
阅读ServerAndThread目录中的源代码
6.1 运行该程序(截图)。简述这个程序的主要功能。
主要功能就是客户端与服务端之间的通信
6.2 画出源代码的结构图(各个类的依赖关系)。并简要说明各个类的功能。
ClientChart:设置客户端界面
ClientReadThread:客户端读取线程
ClientListener:客户端的监听器
服务端同理可得
MainThread:启动服务端;监听到客户端连接后,加入客户端的列表中;启动服务端读取线程
6.3 简述这个程序有什么不足之处及改进方法.
- 服务端发送的信息在客户端中没有和客户端自己发送的消息区分开来
就自己发送的时候注明一下,分开来就好了 - 服务端的输出没有另起一行
那就加个换行符…… - 还有就是自己会被再发一遍消息
就是遇到同一客户端即跳过
7. 网络爬虫
使用Socket、URL、正则表达式、流等编写一个网络爬虫可以将cec.jmu.edu.cn及其所包含链接上的所有网址的图片都下载下来,抓取深到不超过5。
改成3了,5跑的太久……
3.码云上代码提交记录
题目集:多线程(4-4到4-10)
3.1 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
4. 课外阅读
4.1 Java Tutorial:Custom Networking
Networking Basics
在网上运行的电脑都是用TCP和UDP来进行互相通信的。当我们写网络程序的时候,都是在应用层上操作。一般来说,我们都不用关心TCP和UDP层。可以使用java.net包。这些类提供独立于系统地网络通信。
TCP:
当两个应用想可靠地和对方联系,他们会建立联系并在这个连接上收发数据。这就像是打电话。TCP保证从连接一端发送的数据都可以到达另一端,并且都会按照发送的顺序接收到。否则,就会报错。
TCP为需要可靠联系的应用提供点对点的通道。HTTP,FTP和Telnet都是这样的例子。数据收发的顺序对于这些应用来说是很重要的。当HTTP用来从URL上读取数据的时候,数据就必须按照发送的顺序接收。否则,就会收到混乱的HTML文件,崩溃的压缩文件或者是无效的信息。
UDP:
UDP的通信是不能保证的。它从一个应用发送数据包,datagrams到另一个应用。发送数据包就像是通过邮寄服务送信:顺序是不重要的,也不能保证。
有些通信是不需要那么严格的标准的。事实上,可能因为可靠通信所产生的额外费用导致服务无效。
比如对于时钟服务来说,数据包丢了,再发一次是没有道理的,因为客户第二次收到的时候,时间已经不对了。如果客户发出两次请求,并且收到了无序的数据包,这并不重要,因为客户可以自己分辨出来然后再发一次请求。TCP在这种场合是毫无必要的,而且会导致时钟服务无效。另一个例子就是ping命令,这边不做赘述。
总的来说,一台主机只有一个物理连接。所有数据都通过这个连接到特定的电脑。然而,数据可能会出于不同的目的在这台主机上运行。所以电脑要想知道是什么应用发送的数据,就用通过使用端口。
在网上传输的数据都会带上主机的地址信息还有目的端口。主机由32位的IP地址来指定,IP地址可以用来将数据准确的送到网上的某台主机上。端口就是一个16位的数字,TCP和UDP就可以送到正确的程序上。
URL:
URL是统一资源定位的缩写,是网上资源的引用。我们可以向Web浏览器提供URL来定位网上的文件,就像是在信上提供地址,邮局才能知道往哪边寄。
Java的Internet程序会用到URL来寻找想要访问的网上资源。可以使用java.net中的URL类来表示一个URL地址。
Socket:
URL和URLConnections提供相对高级的机制来访问网上的资源。有时程序需要使用低级的网络通信。
例如,服务端提供一些服务,比如处理数据库的访问和发送最新的股价。客户使用服务端提供的服务,显示数据库的查询结果或者说向投资者提供股票购买推荐意见。两方的通信必须是可靠的。数据不能丢失,而且必须按照服务端发送的顺序到达客户端。每个程序都会绑定一个socket在连接的末端。为了通信,客户端和服务端都要从socket中读取或者是写入。
Datagrams
一些应用是不需要TCP提供的可靠的、点对点的通道来通信。这时候就可以使用UDP来进行通信。
UDP提供一种网络通信的模式,应用是发送数据包的,就是datagram。datagram是独立的,是否到达,到达时间和内容都是没法保证的。Java提供了相应的类,即DatagramPacket和DatagramSocket。
4.2 HTTP协议简介
服务器把网页给浏览器,就是把网页的HTML代码给浏览器,然后 让它显示出来而已。浏览器和服务器之间的传输协议就是HTTP。
- HTML是用来写网页的
- HTTP是在网络上传输HTML的协议
GET / HTTP/1.1:
GET表示一个读取请求,将从服务器获得网页数据,1.1是HTTP协议的版本,大部分服务器也支持1.0版本。
浏览器依靠Content-Type来判断响应的内容所属的类型。
当浏览器读取到HTML源码后,它会解析HTML,显示页面,然后,根据HTML里面的各种链接,再发送HTTP请求给服务器,获得相应资源。
4.3 一个简单的小爬虫
FileReader类:
用来读链接文件(存放商品的链接),然后getLines()可以返回一个存放Url的列表。
Url类:
getConnection()用来获得链接,返回URLConnection类型
getReader()用来获得链接的输入流
isExist()用来判断是否含有相应字符串,在该程序中就是用来判断是否含有free_msg字符串,即金子商品,如果有,则返回真。具体实现即用BufferedReader按行读取。
Digger类:
这个类继承Thread类,每读入一个链接,就开启一个线程,查看是否有相应字符串,如果有的话,就用IE来打开链接
Runtime.getRuntime().exec("C:/Program Files/Internet Explorer/iexplore.exe " + url.getUrl());