1. 本周学习总结

2. 书面作业

Q1.网络基础

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

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

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

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

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

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

1.1

ping www.baidu.com返回值截图

ping cec.jmu.edu.cn返回值截图

  • 返回时间以及丢包率;时间是指从发出数据包到接受到返回数据包所用的时间,由返回值可知,访问www.baidu.com所用时间15ms至18ms,而访问cec.jmu.edu.cn所用时间1ms(丢包率都是0%);ping命令是用来检查网络是否通畅或者网络连接速度的命令,受传输介质、网速、对方服务器等因素影响,使得返回的时间不同

1.2



  • 连接的远程主机的端口号:23

1.3

输入telnet cec.jmu.edu.cn 80,打开回显,回车

  • 不是cec.jmu.edu.cn的主页内容,cec.jmu.edu.cn的协议是HTTP,需要有HTTP命令才有响应

GET /index HTTP/1.0命令

  • 返回一个web资源,在获取资源之后就断开连接

1.4

例如QQ的使用

  • QQ使用80端口

4000端口是用于大家经常使用的QQ聊天工具的,再细说就是为QQ客户端开放的端口,QQ服务端使用的端口是8000。通过4000端口,QQ客户端程序可以向QQ服务器发送信息,实现身份验证、消息转发等,QQ用户之间发送的消息默认情况下都是通过该端口传输的。

  • 4000和8000端口都不属于TCP协议,而是属于UDP协议。

1.5

必要信息
IP地址和域名
端口
协议
数据传输方式

Q2.编写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进一步观察返回结果。没有任何返回结果,为什么?怎么操作

2.4 启动网络调试助手,将其设置为TCP Server,并启动

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

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

2.6 选做:实现2.5

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

2.1 关键代码截图

2.2

  • "bbs.newsmth.net",23

    截图

  • telnet bbs.newsmth.net 23

    截图

  • 第一个是返回"bbs.newsmth.net"的23端口的界面,只是显示界面,没有实现功能的效果;第二个是连接到"bbs.newsmth.net"的23端口,进入界面,可以输入对应字符串实现该端口的功能

2.3 使用telnet cec.jmu.edu.cn 80,结果如下



界面没有任何东西,而程序则是返回界面所展示的,因为界面为空,所以程序运行没有任何返回结果

2.4

网络调试助手输入字符串:“测试abc”,换行

截图

程序接收

截图

2.5 思路:需要能将信息输出到服务器的功能,主要是得到Socket对象的输出流getOutputStream(),才能从控制台输出信息到服务器,控制台的输入Scanner(System.in)实现,PrintWriter从控制台输出信息,最主要的是在输出后,调用flush()方法起到缓存作用,避免数据丢失

2.6 选做:

关键代码截图

控制台截图

网络调试助手截图

Q3.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 (多线程服务器)

3.1 两个while,第一个是while (!done && in.hasNextLine()),用来判断输入的是menu还是quit;第二个是在菜单的判断,while(xline)用来判断是否退出菜单,仅仅退出菜单显示,退回初始状态而不断开连接,第二个while嵌套在第一个while里,这样在退出菜单时,可以不用断开连接

关键代码截图

运行截图:

  • 初始界面

  • 输入menu,进入菜单,执行1,2和3命令

  • 执行4命令,退出菜单

  • 输入quit,服务器断开,左上网络设置从断开变为连接

3.2

  • 输入telnet localhost 8190

  • 初始界面

  • Eclipse控制台 Spawning 1表示第一个线程

  • 断开连接

  • 再次输入telnet localhost 8190



  • Eclipse控制台 Spawning 2表示第二个线程

Q4.UDP服务器

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

参考:UDPServer.java

  • UDP的使用,只会接收客户端发来的信息,操作还是在服务器,还在探究如何实现UDP输出信息到客户端显示

  • 网络调试助手界面没显示任何信息,输入menu

  • 服务器直接操作的

Q5.论述题:网络程序与流

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

5.1 InputStream和OutputStream,用于服务器(客户端)信息的写入和读取,达到通信的效果

Q6.代码阅读

阅读ServerAndThread目录中的源代码

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

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

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

6.1 截图

  • 主要功能:客户端和服务端实现信息的传递,通信作用

6.2

  • 客户端

  • 服务端

功能
ClientChart 客户端JFrame窗口化,JLabel,JTextField和JButton的增加
ClientListener 监听器
ClientReadThread 接收客户端信息并显示
ServerChart 服务端JFrame窗口化,JLabel,JTextField和JButton的增加
SeverActionListener 监听器
MainThread 建立在线用户列表
ServerReadThread 提示用户连接情况,服务端把收到的消息转发给所有的用户

6.3 不足之处是客户端发送信息时,服务端可以显示是哪个客户端发出哪些信息,但客户端只能看见全部的信息却不知道哪些信息是那个客户端发的,

例如

服务端:

客户端:

  • 三个客户端共享全部的信息,却不知道谁发了这些信息,只有从服务端才可以,可以在程序中加入客户端的名称,以便区别(有点类似QQ群聊天,信息共享,但会显示是谁发的信息);改进:每个客户端在输出信息时,一并输出自己的id或名称来辨别

3. 码云上代码提交记录及PTA实验总结

3.1. 码云代码提交记录

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

最新文章

  1. Java之内存诊断
  2. spring-data-redis注册fastjson序列化工具
  3. Sql与MySQL简单入门
  4. iOS touch事件单击双击区分响应
  5. EffectiveJava——复合优先于继承
  6. 锋利的jQuery-3--css("height")和.height()的区别
  7. 161102、MyBatis中批量插入
  8. 【BZOJ 1563】 [NOI2009]诗人小G
  9. JavaScript笔记 第十六章 匿名函数和闭包
  10. 学习opencv中文版教程——第二章
  11. WPF后台访问XAML元素
  12. 用MFC实现OpenGL编程
  13. 【POJ1741】Tree 树分而治之 模板略?
  14. 在Linux终端下使用代理访问网络(转)
  15. HDFS中NameNode启动过程
  16. 设备类型检测大全---userAgent
  17. AES对称加密
  18. 解决ADT大量出现"Unexpected value from nativeGetEnabledTags: 0"的问题
  19. [LeetCode] Image Overlap 图像重叠
  20. [Swift]LeetCode864. 获取所有钥匙的最短路径 | Shortest Path to Get All Keys

热门文章

  1. 如何输入EOF
  2. Run Performance Testing Which Was Distributed To Multiple Test Agents
  3. 常用perl脚本工具
  4. git 简易使用说明
  5. jenkins 设置 gitlab web hooks
  6. OminiMarkupPreview快捷键
  7. 为什么内存使用2G的苹果手机比内存使用4G的安卓机更流畅?
  8. centos 7 最小安装后 安装FTP服务器 vsftp
  9. Visual Studio2017 远程调试 Remote Debugger
  10. python中字符串中一些函数的用法