分布式计算第二周实验:Socket通讯与HTTP服务器

课程地址

http://ss.sysu.edu.cn/~pml/dct/2_http.html

实验内容

  1. 列出网络七层协议的名称,用一句话分别解释 传输层(TCP/UDP) 与 网络层(IP) 的功能。

    层数名称
    7应用层
    6表示层
    5会话层
    4传输层
    3网络层
    2数据链路层
    1物理层

    传输层:把来自会话层的大量消息分成易于管理的包以便向网络发送,并确保顺序无错。
    网络层:检查IP地址,为数据包选择路由。

  2. Socket 在哪一层? 解释端口号的作用。

    socket本质是编程接口(API),对TCP/IP的封装。所以在传输层。
    端口为标识参与通信的主机、进程和连接提供了一种统一的、惟一的方法。

  3. TCP 也称 流式 Socket。 与流式文件存在联系吗?

    TCP把数据流分区成适当长度的报文段来传输。
    流式文件中构成文件的基本单位是字符,流式文件是有序字符的集合,其长度为该文件所包含的字符个数,所以又称为字符流文件。

  4. 阅读图2-8,连接 Socket 和 数据 Socket 相同吗? 为什么编程时,我们通常只自定义 4 位数的端口号?

    不相同,连接Socket仅用于监听其他客户程序的连接请求,而数据Socket处理客户程序的服务请求。
    大多数TCP/IP实现给临时端口分配1024~5000之间的端口号。大于5000的端口号是为其他服务器预留的(Internet上并不常用的服务)。

  5. 文档中提到工厂方法。请用 UML 图画出 InetAddress , Inet4Address 和 Inet6Address 三者关系。

    这里写图片描述

  6. 对照图2.9,写出每个步骤的关键代码。

    这里写图片描述

    1. 服务器侦听等待连接:

      // 监听客户程序的连接请求
      ServerSocket listenSocket = new ServerSocket(Integer.parseInt(args[0]));
      System.out.println("服务程序正在监听端口" + args[0]);
    2. 客户端请求连接:

      // 建立连接并打开相关联的输入流和输出流
      Socket socket = new Socket(args[0], Integer.parseInt(args[1]));
      System.out.println("当前socket信息:" + socket);
    3. 建立连接:

      Socket socket = listenSocket.accept();
    4. 传输数据:

      服务端:

      // 从与客户程序的新建连接获取输入流和输出流
      PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
      BufferedReader in = new BufferedReader(new InputStreamReader
          (socket.getInputStream()));
      // 从客户端读取数据,并写回数据的加工结果
      String message;
      while ((message = in.readLine()) != null) {
          System.out.println("收到请求:" + message);
          out.println(message.toUpperCase());
      }

      客户端:

      PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      
      // 将控制台输入的字符串发送给服务端,并显示从服务端获取的处理结果
      BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
      String userInput;
      while ((userInput = stdIn.readLine()) != null) {
       out.println(userInput);
       System.out.println("返回:" + in.readLine());
      }
      stdIn.close();
    5. 关闭连接:

      // 关闭连接
      out.close();
      in.close();
      socket.close();
  7. (!)修改 MTEchoServer, 用 java 的 List<> 对象管理客户端连接的服务线程。当连接断开后,服务线程只是挂起。在新连接请求时,如果有挂起的服务线程,直接为新连接服务。

  8. 写出 RFC 和 IETF 的全称。 给出 HTTP1.1 协议的 RFC 编号以及全文的网址。

    RFC( Requests for Comments, Internet 标准草案定义组织)
    IETF( Internet 工程任务组, Internet Engineering Task Group)
    RFC2616(http://www.cnpaf.net/Class/HTTP/200811/23277.html

  9. 阅读 Daytime 协议开发, 简单解释图 2-11 的含义。它对程序阅读的作用。

    这里写图片描述

    MyStreamSocket 类继承 Socket 类, setStreams()方法得到数据输入流 InputStream 与 输 出 流 OutputStream,sendMessage()方法发送数据流,receiveMessage() 接收数据流。通过ServerSocket 类的实例化产生流Socket,当MyStreamSocket 收到客户端请求后,由 sendMessage()方法返回消息给客户端。客户端帮助类 DaytimeClientHelper2 向服务端发送请求并接收响应消息。

  10. 编程序经常会编写 xxHelper 类,请描述 DaytimeTCP 程序中,DaytimeClientHelper2 类发挥的作用。

    客户端帮助类创建 MyStreamSocket 类的实例对象 mySocket,由实例对象的receiveMessage()方法接收服务端的响应消息。

  11. 运行 java 版本 HttpServer。设计 3 个 curl 指令,测试程序的三种输出响应,给出控制台输入与输出。

    在服务端的目录下新建文件index.html,当直接访问端口8000时,可以直接获取index.html下的内容
    这里写图片描述
    在win10新的版本中系统会自带PowerShell,在PowerShell中可以直接使用curl,如下
    这里写图片描述
    如果不是win10的话可以从网上下载curl的程序,并在cmd中运行(下面的例子都是在cmd中运行的)

    1. 第一种响应为正常响应,使用curl localhost:8000/index.html,可以打印index.html的文本内容
      这里写图片描述

      这里写图片描述

    2. 第二种响应为未发现目标,使用curl localhost:8000/123.html

      这里写图片描述

      这里写图片描述

    3. 第三种响应为错误的请求,当请求post方法时,便会返回错误的请求,所以使用curl -d “123” localhost:8000/index.html
      这里写图片描述
      这里写图片描述

个人学习小结

  1. Socket:
    Socket是物理网络地址和逻辑端口号的一个集合,通过这个集合可以向另外一个位置的与它具有相同定义的Socket进行数据传输。由于Socket是由机器地址和端口号来识别的,那么在一个特定的计算机网络上,每一个Socket都是以此方式被唯一识别的。这就使得应用程序可以唯一被定位。套接字类型有二种:一个是流式Socket,它提供进程之间的逻辑连接,并且支持可靠的数据交换;另一个就是数据包Socket,它是无连接的并且不可靠。

  2. TCP 传输控制协议:
    传输控制协议( TCP: Transfer Control Protocol)是一种面向连接的传输层协议,可为两台不同主机上的应用程序提供可靠的数据流连接。所谓“面向连接”,意味着两个使用TCP通信的应用程序在交换数据之前,必须先建立一个TCP连接,待通信结束后须关闭该连接。

  3. UDP 用户数据报协议:
    用户数据报协议( UDP: User Datagram Protocol)不是基于连接的,而是为应用层提供一种非常简单、高效的传输服务。 UDP从一个应用程序向另一应用程序发送独立的数据报,但并不保证这些数据报一定能到达另一方,并且这些数据报的传输次序无保障,后发送的数据报可能先到达目的地。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值