zoukankan      html  css  js  c++  java
  • SSD8 exercise01

        新的一学期 又带去回了SSD8,网络与分布式课程。今年开始改革了,所以我们助教要一个一个查作业。然后我就陷入了一场帮别人圆谎的博弈赛中。有鉴于此,我就几个关键点对SSD8 exercise01关键点进行描述。首先FTP里面有个wireshark-setup-1.0.8.exe的软件,大家不妨打开看看,这个wireshark的抓包工具的教程网上一搜一堆,大家可以看下。

    先说说这个题是干嘛的,你要完成三个类

    1 Client.java,这个类就是模拟一个HTTP的客户端,发出“请求报文”,解析“响应报文”。

    2 SimpleServer.java这个类是模拟一个HTTP的服务器,解析“请求报文”,向Client.java返回“响应报文”。

    3 多线程的HTTP服务器,响应并发的Client.java但是以现有的实验室资源没法测试,你也可以写个ThreadClient.java来试试。

     HTTP的请求报文张这样:

    GET /enclosure/2010-09-10T02_51_05-07_00.mp3 HTTP/1.1

    Host: 805665086.podomatic.com Connection: keep-alive

    User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7

    Accept: */*

    Referer: http://www.1g1g.com/player/loader.swf?uid=0.8106261373031884

    Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8

    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
    [不要忘了这有空行或者CRLF]

    HTTP的响应报文张这样:

     HTTP/1.1 200 OK 

    Server: XNHttpServer1.0
    Content-Type: text/html;charset=UTF-8
    Content-Length: 79
    Connection: keep-alive
    Keep-Alive: 300
    Cache-Control: no-cache
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    [不要忘了这有空行或者CRLF,分割了报文头和报文体]
    <msglist><message type='system'><body>init ajax loop</body></message></msglist>

    那么现在开始程序方面的问题。

    Client.java代码框架大概是这样。

    创建Socket;

    socket = new Socket(host, PORT);

    打开连接到Socket的输入/出流;

    ostream = new BufferedOutputStream(socket.getOutputStream());
    istream = new BufferedInputStream(socket.getInputStream());

     下面开始最最重要的步骤就是发出“请求报文”,解析“响应报文”。

    这里是检查的重点

    首先你要拼出请求报文的请求行

    长这样GET /index.html HTTP/1.1[crlf][crlf]

    这样就足够了,有的同学把首部行也拼了出来,也没错,但是工作量上去了。这样其实就可以了socket就可以帮你把你的“请求报文”发送到服务器段的host上去了。

    还记得当时你打开socket的ostream吗?用它来发送就行。以上面的为例

    ostream.write(buffer, 0, request.length());
    ostream.flush();

    就可以发送了。不同的流有不同的方法,具体查看JDK。

    下面解析“响应报文”。

    你要获得一段流,输入流,哪来的自己找去。我从网上找了一段很精妙的代码,各位看官看看。

                    boolean inHeader = true; // loop control
            char c = 0;
            while (inHeader && ((c = istream.read()) != -1)) {
                switch (c) {
                case '
    ':
                    break;
                case '
    ':
                    if (c == last) {
                        inHeader = false;
                        break;
                    }
                    last = c;
                    header.append("
    ");
                    break;
                default:
                    last = c;
                    header.append((char) c);
                }
            }

    引入标志位inHeader来记录当前是不是在解析响应报文头。同时判定是不是有两个连续的crlf。

    再来你就把剩下的东东报文体就是直接保存在一个byte数组或者String中就可以了。

    最后不要忘了关闭SOCKET。

    SimpleServer端和Client反过来了,大家可以尝试一下。自己写写,切记报文处理逻辑和SOCKET是考察重点。

  • 相关阅读:
    Kubernetes日常维护命令
    4-docker的三要素
    3-docker的安装
    2-docker介绍
    1-为什么要使用docker
    块存储、文件存储、对象存储意义及差异
    ceph分布式存储的搭建
    YAML入门:以创建一个Kubernetes deployment为例
    Zabbix通过SQL语句从数据库获取数据说明
    图解HTTP--03--http报文内的信息
  • 原文地址:https://www.cnblogs.com/hellowu/p/3422511.html
Copyright © 2011-2022 走看看