201521123037 《Java程序设计》第13周学习总结 1. 本周学习总结 2. 书面作业 3. 码云 4.课外阅读

以你喜欢的方式(思维导图、OneNote或其他)归纳总结多网络相关内容。
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

2. 书面作业

1. 网络基础

1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同?
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

可以看到回复的IP地址、回复的时间、TTL不同。每个域名都有相对应的IP地址,标识该应用程序。相较于IP地址,域名更易被记住。ping的时间指的是网络延时,跟服务器的远近有关,还与服务器的响应时间、访问服务器之间的节点、服务器负载、连接速度等有关。112.80.248.74是江苏省南京市 联通,210.34.128.152是福建省厦门市 教育,服务器距离更近所以210.34.128.152回复的时间更短。

1.2 telnet bbs.newsmth.net,上面这条命令连接的是远程主机的什么端口号?
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

TCP23号端口。

1.3 telnet cec.jmu.edu.cn 80,尝试回答:你从屏幕看到的是一些什么内容?返回的内容是不是cec.jmu.edu.cn的主页内容?尝试使用GET /index HTTP/1.0命令,会返回什么?见实验任务书题目1
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

提示连接失败的相关信息。返回的不是主页内容。

201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

返回cec.jmu.edu.cn主页源代码的内容。

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

201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

本地端口在私有端口中随机产生一个端口号,浏览器有些远程端口为443端口采用TCP协议,表示安全的超文本传输协议,常用于浏览器。QQ采用80端口,TCP协议,可进行超文本传输。36.250.8.123地址分布在福建省福州市 联通信号,有使用TCP协议也有使用UDP协议的。

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

确定目标资源的IP地址、域名、端口号以及对应的可靠或不可靠协议。在连接的基础上,从Socket对象中获得的流进行操作,实现网络通信。

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

2. TCP客户端程序编写

2.1 参照SocketTest.java编写一个简单的连接远程服务器小程序Client.java,启动时需要首先在控制台指定远程主机IP与端口号。(截图,出现自己学号)

201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

2.2 将程序中的网址改成bbs.newsmth.net,端口号改为23,再次观察返回结果?尝试使用telnet bbs.newsmth.net 23。对比返回结果
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

返回结果都是bbs.newsmth.net网页的主页,但控制台没有直接在cmd中看到的美观,出现一些乱码。

2.3 将程序中的网址改成cec.jmu.edu.cn,端口号改为80进一步观察返回结果。没有任何返回结果,为什么?

TCP80端口表示http协议即超文本传输协议,连接该接口相当于访问web服务器,需要用web服务器的相关指令,如GET请求方法。

2.4 启动网络调试助手,将其设置为TCP Server,并启动
尝试使用Client.java连接该TCP Server,并发送信息。
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

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

  • 交互通信
    201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读
//开启多线程
public class Client {
    public static void main(String[] args) {
        try{
            Socket s=new Socket("127.0.0.1",8080);
             try
             {
                Thread t1=new Thread(
                        new Runnable(){
                            public void run(){
                                //从客户端写入服务器端
                                PrintWriter out = null;
                                try {
                                    out = new PrintWriter(s.getOutputStream());
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                                Scanner sc=new Scanner(System.in);
                                while(sc.hasNextLine())
                                {
                                	String str=sc.nextLine();
                                    out.println(str);
                                    out.flush();
                                }
                                
                            }
                        }
                ); 
                Thread t2=new Thread(
                        new Runnable(){
                            public void run(){
                                //从服务器端读出数据到客户端
                                Scanner in = null;
				try {
					in = new Scanner(s.getInputStream());
				} catch (IOException e) {
					e.printStackTrace();
				}
                                while(in.hasNextLine())
                                {
                                   String line = in.nextLine();
                                   System.out.println(line);
                                }
                            }
                        }
                );
                t1.start();  
                t2.start();
                try{//线程完成后再退出主线程
               	    t1.join();
	            t2.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
             }
             finally
             {
                s.close();
             }
        } catch (IOException e)
          {
             e.printStackTrace();
          }
    }
}

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

3. ServerSocket与TCP服务器

3.1 简易单线程MenuServer,题目3.1-3.4。(关键代码及运行截图,包含学号)可以使用网络调试助手,将其设置为TCP Client(IP与端口填你的MenuServer的IP与端口),连接你的MenuServer。其中的文件搜索功能为选做?

  • 题目3.1
public class MenuServer037
{
   public static boolean menu(Socket s,Scanner in,PrintWriter out){
	   out.println("1.显示服务器当前时间");
	   out.println("2.您的IP");
	   out.println("3.退出菜单");
	   String line=in.nextLine();
	   if(line.trim().equals("1"))
		   out.println(new Date().toString());
	   else if(line.trim().equals("2"))
		   out.println(s.getInetAddress().toString());
	   else if(line.trim().equals("3"))
		   return false;
	   return true;
   }
   public static void main(String[] args)
   {
      try
      {
         // establish server socket
         ServerSocket s = new ServerSocket(8190);

         // wait for client connection
         Socket incoming = s.accept();
         try
         {
            InputStream inStream = incoming.getInputStream();
            OutputStream outStream = incoming.getOutputStream();

            Scanner in = new Scanner(inStream);
            PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);

            out.println("Hello! Enter quit to exit.");

            // echo client input
            boolean done = false;
            while (!done && in.hasNextLine())
            {
               String line = in.nextLine();
               if(line.trim().equals("menu")) {
            	   out.println("进入菜单:");
                   boolean flag=true;
            	   while(flag){
            		   flag=menu(incoming,in,out);
            	   };
            	   out.println("退出菜单.");
               }
               if (line.trim().equals("quit")) done = true;
            }
         }
         finally
         {
            incoming.close();
         }
      }
      catch (IOException e)
      {
         e.printStackTrace();
      }
   }
}

201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

  • 题目3.2(使用telnet localhost 8190)

201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

  • 题目3.3(在Client开启多线程)

201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

  • 题目3.4->如题目3.1代码所示

3.2 多线程MenuServer。(截图证明你这个是多线程服务器,使用telnet连接)
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

3.3 选做:图形界面的MenuServer

  • 可以控制服务器的启动停止、查看客户端链接的基本信息(IP、端口、链接时间)
    拓展:在服务器端断开某个客户端的链接、查看客户端发送的给服务器端的日志记录
  • 参考:实验任务书-题目3
  • 参考:EchoServer.java,ThreadedEchoServer.java (多线程服务器)

4. UDP服务器

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

201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

  • 参考:UDPServer.java

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

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

根据网络程序的特性选择可靠或不可靠的协议。如简单的文字聊天可选用UDP协议,访问应用层协议服务器前需要建立关系的则选用TCP协议。对于TCP协议,可以使用InputStream和OutputStream或进一步采用字符流进行包装;对于UDP协议,可直接采用DatagramPacket中的getData和setData方法。

6. 代码阅读

阅读ServerAndThread目录中的源代码
6.1 运行该程序(截图)。简述这个程序的主要功能。
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

实现多个客户端同时访问服务器端,与服务器端进行通信。

6.2 画出源代码的结构图(各个类的依赖关系)。并简要说明各个类的功能。
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

6.3 简述这个程序有什么不足之处及改进方法.
201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

客户端接收的消息都显示为客户端说,不够具体,如果能具体显示哪一个线程发来的消息就更好了。 修改服务器端给客户端发送信息的内容。

201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

选做:7. 网络爬虫

使用Socket、URL、正则表达式、流等编写一个网络爬虫,可以将cec.jmu.edu.cn及其所包含链接上的所有网址的图片都下载下来,抓取深到不超过5.

选做:8. 简易搜索引擎(进阶)

8.1 写出设计思路即可。该搜索引擎包含几部分?里面核心的实现思路?如果能用框架图、流程图画出架构
8.2 以计算机学院网站为例,进行测试。比如,输入ACM后搜索,可以将包含ACM的的网页抽取出来。(可作为课程设计题目)

3. 码云

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

201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结
2. 书面作业
3. 码云
4.课外阅读

4.课外阅读

4.1 Java Tutorial:Custom Networking

Trail: Custom Networking
主要看Overview of Networking,Working With URLs,All About Sockets,All About Datagrams

4.2 HTTP协议简介

服务器与浏览器之间使用http协议,html是用来定义网页的文本。HTTP请求的过程:浏览器向服务器发送HTTP请求(内容:请求方法(GET或POST)+路径+域名等)->服务器回应浏览器的响应(内容:响应代码+响应内容等)。HTTP格式:GET请求格式、POST请求格式、HTTP响应格式。

4.3 一个简单的小爬虫

Java编程技巧:小爬虫程序.docx

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官网