Java第14周作业
1.本周学习总结
1.1以你喜欢的方式(思维导图、OneNote或其他)归纳总结多网络相关内容。
- Socket类(用户类)的一般操作步骤:
| - 通过new
关键字或者ServerSocket
类中的accpet()
方法建立Socket对象,指定连接服务器的ip和端口
| - 通过getInputStream
,getOutputStream
方法获取Socket对象的输入流和输出流
| - 进行流的操作,eg:Scanner
,PrintWriter
的使用。
| -close()
方法关闭资源操作。 - ServerSocket类(服务器类)的一般操作步骤
| -new
新建一个ServerSocket对象,指定开启的端口号
| - 使用accept()
方法获取连接的用户(Socket对象)
| - 使用getInputStream
,getOutputStream
方法获取流
| - 对流进行操作,可以使用Scanner
扫描流和PrintWriter
打印流
| -close()
关闭所有的资源操作
网络通信的两种类型UDP
,TCP
- TCP的网络通信:(三次握手)
| -服务器创建ServerSocket对象,使用accept()
方法等待用户连接。
| - 客户端创建Socket对象,对服务器的端口进行访问,请求建立连接。
| -服务器接受客户端的请求之后,与客户端建立连接,而后再等待新的客户端进行连接。
| - 属于可靠连接。 - UDP的网络通信:
| -封装数据成包,将整个数据包发送往目的地,在目的地处才进行处理。
| -接收别人发送的数据包,对其进行处理
| -没有TCP的三次握手操作,属于不可靠的连接,但是开销小。
2. 为你的系统增加网络功能(购物车、图书馆管理、斗地主等)-分组完成
为了让你的系统可以被多个用户通过网络同时使用,需要为你的系统增加网络功能。
2.1 简述你想为你的系统增加什么网络功能?设计思路是什么?
- 增加的功能:
网络访问功能
- 设计思路:通过构建一个
Server
类,能够实现多个用户同时进行访问操作,因此继承于Runnable
接口,在run()
方法中实现对图书馆文件进行读取操作和写入操作。
2.2 系统通过网络传递了什么信息?信息的格式是什么?
- 通过网络传递了
I/O输入流和输出流
上的操作信息,先使用字节流InputStream
,OutputStream
对信息进行保存,而后再用Scanner
扫描流,PrintWriter
打印流进行读取和打印操作。
2.3 你的网络模块使用了TCP还是UDP技术?模块中的常用类是什么?
- 使用的是
TCP
技术。 - 模块中的常用类:
| -ServerSocket
类
| -Socket
类
| -Thread
类,Runnable
接口,用于实现多用户访问的多线程技术。
2.4 截图网络通讯部分的源代码,并进行简单说明。
- 部分源代码:
- 用于启动多线程,即多用户访问模块
- 服务器端启用的是8081端口,用户通过连接这个端口和服务器的ip可以访问。
- LibraryRunnable类实现Runnable接口, 用于执行图书馆管理的操作,使用
InputStream
,OutputStream
先获得连接用户的输入流和输出流,再根据用户的输入输出进行操作。 - 运行结果:
3. 码云与PTA
3.1统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中。
周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
1 | 120 | 120 | 2 | 2 |
2 | 280 | 160 | 5 | 3 |
3 | 590 | 310 | 10 | 5 |
4 | 780 | 190 | 12 | 2 |
5 | 1290 | 510 | 17 | 5 |
6 | 1710 | 420 | 20 | 3 |
7 | 2513 | 803 | 24 | 4 |
8 | 2513 | 0 | 24 | 0 |
9 | 3014 | 501 | 27 | 3 |
10 | 3441 | 327 | 30 | 3 |
11 | 4121 | 680 | 37 | 7 |
12 | 4667 | 546 | 42 | 5 |
13 | 5214 | 547 | 48 | 6 |
14 | 5834 | 620 | 50 | 2 |
选做:4. 网络学习指导(以下作业内容均为选做)
4.1. 网络基础
4.1.1 比较ping www.baidu.com
和ping cec.jmu.edu.cn
,分析返回结果有何不同?为什么会有这样的不同?
- 返回结果中,回复消息的
ip地址
不同。 - 原因:这两个域名对应的服务器地址不同,因此来自服务器的回复(
ip地址
)也不同。
4.1.2 telnet bbs.newsmth.net
,上面这条命令连接的是远程主机的什么端口号?
- 这条命令连接的是远程主机的23号端口。
4.1.3 telnet cec.jmu.edu.cn 80
,尝试回答:你从屏幕看到一些什么内容?返回的内容是不是cec.jmu.edu.cn的主页内容?尝试使用GET /index HTTP/1.0
命令,会返回什么?详见实验任务书题目1。
-
输入
telnet cec.jmu.edu.cn 80
后,从屏幕看到的内容如下:
-
可见,什么东西都没有,并不是
cec.jmu.edu.cn
的主页内容。 -
使用
GET /index HTTP/1.0
的命令,会返回浏览器可识别的代码。
4.1.4 启动ConnectionWatcher, 然后启动若干个可以联网的程序(如QQ, telnet,浏览器等),查看本机上有什么程序联网,使用了什么端口?QQ占用了什么端口和那些远程IP进行交互,这些IP分布地在那里?使用了什么协议进行通信?
- 启用了QQ管家,QQ等程序。
- 使用端口:
52604
,10101
,52896
- QQ占用了
54219
端口,与远程ip183.232.84.67
进行交互,这些IP分布地如下 - 使用了TCP进行通信,也有的使用UDP进行通信。
4.1.5 编写网络程序必不可少的几个信息是什么?
-
编写网络程序需要的信息如下:
| - 服务器的端口号
| - 服务器的IP地址
| - 域名
| - 使用的协议 -
参考:实验任务书-题目1
4.2 编写TCP客户端程序
4.2.1 参照SocketTest.java编写一个简单的连接远程服务器小程序Client.java,可以接收并显示服务器发送的信息。启动时需要首先在控制台指定远程主机IP与端口号。(截图,出现自己学号)。
- 以下就是编写的Client.java程序,以及运行结果。
4.2.2 将程序中的网址改成bbs.newsmth.net,端口号改为23,再次观察返回结果?尝试执行telnet bbs.newsmth.net 23
,对比返回结果。
4.2.3 将程序中的网址改成cec.jmu.edu.cn,端口号改为80进一步观察返回结果。没有任何返回结果,为什么?怎么修改代码才能正常显示?选做:为什么会返回乱码?如何解决?
4.2.4 启动网络调试助手,将其设置为TCP Server,并启动。尝试使用Client.java
连接该TCP Server,使用该服务器向Client发送信息。(截图关键代码与运行结果)
4.2.5 回答:现在的Client.java
只能接收信息,能否改造Client.java
使其可以与服务器进行交互(服务器可以发送信息给Client,Client也可发送信息给服务器),写出大概思路,不要运行截图。
- 在
Client
用户端添加一个PrintStream
来接收用户端的输出流,然后对流进行操作,以此将Client输入的信息发送给服务器。 - 还需要一个
Scanner
的扫描流对象,通过new Scanner(System.in)
读取键盘输入,然后将读取的输入赋给String类
的对象,最后通过PrintStream
的输出流对象输出。 - 在用户端输出完之后,再通过if语句
if(Client的输入流对象.hasNext())
判断服务器端是否有回应,如果有的话就输出内容。
4.2.6 选做:实现2.5。截取关键代码并进行说明。
- 参考:实验任务书-题目2
4.3 ServerSocket与TCP服务器
4.3.1 简易单线程MenuServer,题目3.1-3.4。(关键代码及运行截图,包含学号)可以使用网络调试助手,将其设置为TCP Client(IP与端口填你的MenuServer的IP与端口),连接你的MenuServer。其中的文件搜索功能
为选做。
4.3.2 多线程MenuServer(截取关键代码证明你这个是多线程服务器,请使用多个telnet连接测试)。
- 可以控制服务器的启动停止、查看客户端链接的基本信息(IP、端口、链接时间)
- 拓展:在服务器端断开某个客户端的链接、查看客户端发送的给服务器端的日志记录
- 参考:实验任务书-题目3
- 参考:
EchoServer.java
,ThreadedEchoServer.java (多线程服务器)