集美大学 计算机 郑如滨

教学博客

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

参考资料

  1. 本次实验参考文件
  2. NetAssist网络调试助手
  3. 网络调试助手的使用 调试TCP,UDP
  4. 漫画:HTTP 协议极简教程,傻瓜都能看懂!
  5. 正则表达式参考资料

注:主要根据"本次实验参考文件"中实验任务书的指导完成本次实验。

1. 网络基础

  1. 使用ipconfig、ping查看网络状况。
  2. 使用ConnectionWatcher资源监视器netstat -an查看本机网络连接情况。
  3. 可选:使用curl访问HTTP服务器。
  4. 可选:使用telnet或网络调试助手作为客户端连接远程主机
    • 连接BBS、连接网络调试助手创建的服务器,连接Web服务器。
    • 电脑如未安装telnet,可以在控制面板-程序-添加/删除Windows功能中选择Telnet客户端进行安装。

2. 编写TCP客户端程序

任务:

  1. 编写一个简单的TCP客户端TCPClient.java(参考TCPClientTest.java)
    • 在一个循环中先发送信息给服务器端、再接受服务器端的信息。
    • 将控制台输入的信息发送给客户端
    • 注意:客户端发送消息是,注意缓冲区问题(是否要flush或autoflush)
    • 注:TCPClient中远程服务器IP不要填入127.0.0.1或localhost,否则可能会出现 Connection Refused!
  2. 使用网络调试助手建立一个TCP Server。然后运行TCPClient.java连接该TCP Server
    • 注意:服务器向客户端发送信息时,如果客户端使用hasNextLine()nextLine()方法,那么服务器端发送的消息需带回车换行客户端才能将消息读出(在网络调试助手中使用Shift+Enter加回车换行。)。
    • 常见错误:网络调试助手显示bind() failed表示相应端口已经被其他程序占用,请结束其他程序。
  3. 使用网络工具(netstat -an | find "端口号"或资源监视器等)查看TCPClient.java客户端使用什么端口连接用网络调试助手新建的TCP服务器?查看客户端与服务器端对应的进程名是什么?分别使用了哪两个端口进行通信?怎么证明是这两个进程在进行通信?
  4. 怎么解决客户端、服务器端的中文乱码问题(加分)? 提示:用InputStreamReader、OutputStreamWriter解决。或者直接询问AI。

思考:

  1. 这个实验里,客户端与服务器端分别是谁?他们之间使用什么协议进行通信?
  2. 客户端使用nextLine()读取服务器端发来的信息,可能会碰到什么问题?怎么解决?
  3. 使用你编写的TCPClient与网络调试助手同时连接你刚才假设的服务器。能否连接成功?为什么?可使用工具,如ConnectionWatcher,查看客户端与服务器的连接。
  4. TCPClient是不是只能严格按照“发送消息、接收消息、发送消息、接收消息....”这样的顺序执行?为什么?改进思路?

3.ServerSocket与TCP服务器

任务:

  1. 编写单线程MenuServer服务器(以TCPEchoServer.java作为模板。可使用IDE的Refactor功能进行改名)
    • 基本功能:服务器可对连接进来的客户端发送字符菜单,可根据客户端发送过来的选择,执行相应的功能并将结果返回给客户端。
      • 菜单中包含如下选项:1.显示服务器当前时间2.显示客户端的IP与端口3.退出菜单。详见任务书。
    • 验证:在另外一台电脑上启动网络调试助手,连接你编写的服务器端。注意:IP地址能设定为127.0.0.1吗?
    • 验证:两个同学,用一台电脑上的TCPClient连接另外一台电脑上的MenuServer。只需接收到服务器端的信息即可。
    • 常见问题1:当客户端选择退出菜单,服务器也终止运行从而无法被其他客户端访问。如何改进?
    • 常见问题2:IDE中显示Address already in use ,端口已经被占用,先关闭占用该端口的程序。
  2. 考核:编写多线程MultiThreadMenuServer服务器(参考TCPMultiThreadEchoServer.java与ThreadEchoTask.java)
    • 加分: 改造MenuServer服务器,使其可以同时接受多个客户端的连接请求?并能解释清楚,为什么改造后的服务器程序可以接收多个客户端连接。
    • 进阶: 尝试使用自己编写的TCPClient访问自己编写的MultiThreadMenuServer。
  3. 特别加分: 编写基于TCP与多线程的可与服务器进行交互的TCPClientUtil
    • 网络调试助手可实现同时发送与接受消息。改造TCPClient.java实现同时收发消息的功能,即编写一个网络调试助手的TCP Client。
    • 特别加分:将TCPClientUtil.java改造成带图形界面的程序。

参考资料:

EchoServer.java,ThreadedEchoServer.java (多线程服务器)

进阶思考:
前面实验中,服务器与客户端之间传递的都是字符。如果希望服务器与客户端之间传递字节,比如传递一个对象或一个字节数组。要怎么实现?如果要实现从服务器端搜索文件并下载,怎么编写客户端与服务器端(特别加分)。

4. 访问HTTP服务器

任务1:编写可以读写Web网页的Socket程序。

分析:

编写该程序时,需要了解简单的HTTP协议。即,如何使用符合HTTP协议的命令向Web服务器请求一个网页。
可使用浏览器的开发者工具,查看使用HTTP访问Web服务器的请求头(Request Header)。具体步骤如下:

  1. 打开浏览器按F12,启动开发者工具,点击“网络”标签。然后输入网址访问。或者使用curl工具查看。
  2. 在"网络"标签点击"HTML",找到相应条目。右键点击该条目,选择“复制”-“复制请求头”。

请求头中的关键信息如下:

GET / HTTP/1.1
Host: cec.jmu.edu.cn

在编写程序时可参考请求头中的关键信息以实现对指定网页的访问。

实现:

  1. 改造TCPClient.java为HTTPClient,让其可以访问Web服务器上页面。
    • 注意:除了上面两行字符串。还应输出一个空行(使用out.println()实现。)
    • 问题:网页中的中文是乱码,如何解决?提示:使用InputStreamReader。
  2. 进一步改造HTTPClient.java,将网页下载存为文件。

任务:使用URL类访问Web服务器(已废弃)

任务2:访问HTTP网页(使用AI辅助)

5. UDP服务器

使用UDP改造前面的MenuServer与对应的MenuClient

6. 综合实验:使用正则表达式进行网页信息爬取

想要编写一个程序,可以将指定网址的所有普通链接

<a href="....." >

与图片链接

<img src=".....">)

都抓取下来。完成此程序需要进行复杂的字符串匹配,需要使用正则表达式。

正则表达式练习:

  1. 如何使用正则表达式判断一个给定的字符串是否是10进制数字格式?尝试编程进行验证。
  2. 修改HrefMatch.java
    • 尝试匹配网页中的数字字符串
    • 尝试匹配网页中的图片字符串

注意:

  • 图片字符串的格式类似img src="style/suizi/more.gif",还要注意特例。如img border= "0" src=....
  • 可使用java HrefMatch http://cec.jmu.edu.com 来进行测试。

参考资料:

HrefMatch.java
常用正则表达式.txt
Java正则表达式的语法与示例

特别加分:进一步改造上面的程序,获得图片的链接,如IMG src=“images/mail1.gif”,然后经过处理,生成该图片的实际链接地址http://cec.jmu.edu.com/images/mail1.gif最后将生成的若干地址,放入一个队列。编写方法,可以依照该队列的所有图片地址,一次将图片下载下来。

下次实验

Java第11次实验(数据库)

posted on 2017-05-16 23:03  zhrb  阅读(1462)  评论(0)    收藏  举报