《互联网程序设计(Java)》——课程笔记10:Http程序设计

2023-11-03

1、概论

HTTP系统包括客户端软件(浏览器)和服务器软件(HTTP服务器)。早期的客户端软件,其主要工作可理解为文件下载和文件显示。

实际上现代的HTTP客户端比文件下载要复杂得多,它包括网页文件的下载、跨平台的本地显示,参数的传递,动态网页的实现,以及交互等功能。

HTTP系统程序设计包括:

(1)   客户端软件(web浏览器软件如IE浏览器、360浏览器)

(2)   服务器软件(web服务器软件如微软的IIS,Apache Tomcat等)。

 

HTTP系统客户端的工作过程是:

(1)   客户端软件和服务器建立连接(TCP的三次握手);

(2)   发送HTTP头格式协议;

(3)   接收网页文件;

(4)   显示网页。

HTTP系统服务端的工作过程:

(1)   服务器软件开启80端口;

(2)   响应客户的要求、完成TCP连接;

(3)   检查客户端的HTTP头格式发送客户请求的网页文件(含动态网页)。

 

本课题主要学习网页下载程序设计技术。网页下载技术是搜索引擎、网络爬虫、网页采集器或网络推送服务等相关应用领域内的基础技术。

 

 

2、程序设计第一步:基于TCP套接字Socket的网页下载程序设计

    利用TCP客户套接字Socket(host,port)和HTTP服务器进行信息交互,具体工作如下:

(1)新建一个包名:http,新建或将原有的TCPClient.java程序复制并重新命名为HTTPClient.java,其中字符输出流的编码设定为“ASCII”或者“GB2312”,字符输入流的汉字编码一般设定为“UTF-8”。

图1 TTTP连接窗口

(2)创建HTTPClientJFrame.java程序,界面设计如图1。在“连接”按钮中放置连接服务器的代码和启动输入流“读线程”。

在“网页请求”按钮中发送HTTP请求头标准格式(关于HTTP请求头的更多信息可查阅互联网)。

HTTP的头格式如下(具体见例子程序):

 // GET /index.jsp  HTTP/1.1;//访问指定网页.

GET / HTTP/1.1;//访问默认网页,注意‘/’前后要留有空格

Host: "+address+";//address指服务器的IP或域名

Accept: */*;

Accept-Language: zh-cn;

Accept-Encoding: gzip, deflate;

User-Agent: Mozilla/4.0(compatible; MSIE 6.0; Windows XP);

Connection: Keep-Alive;

 

将上述的HTTP头格式构成一个字符串(通常用StringBuffer类),一致发送到HTTP服务器。

 

具体如下

String ip = jTextField1.getText();
        StringBuffer msg = new StringBuffer("GET / HTTP/1.1" + "\r\n"); //
      //  StringBuffer msg = new StringBuffer("GET / connecttest.txt HTTP/1.1 " + "\r\n"); //注意/后面需要有空格
        
        msg.append("HOST:" + ip + "\r\n");
        msg.append("Accept: */*" + "\r\n");
        msg.append("Accept-Language: zh-cn"  + "\r\n");
        msg.append("Accept-Encoding: deflate" + "\r\n");
        msg.append("User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows XP)" + "\r\n");
        msg.append("Connection:Keep-Alive" + "\r\n");
        //msg.append
        tc.send(msg.toString());

3、程序设计第二步:基于URL类的网页下载程序设计

    (1)利用URL类来访问HTTP服务器,主程序为URLClientJFrame.java。,界面布局可参见如图2所示。

 

图2 使用URL类实现HTTP访问

 

在“发送”按钮中设置如下关键代码,并安置和启动一个输入流“读线程”。

     //创建URL实例(完成3次握手连接,并自动选择不同的头格式),其中IPAddress是字符串类型,形如:http://www...或ftp://。

     URL url = new URL(IPAddress);

     //取得URL的字节输入流

      InputStream in=url.openStream();

     //装饰成字符输入流

BufferedReader br;

      br=new BufferedReader(new InputStreamReader(in,"utf-8"));

 

(3)   在输入框中实现鼠标拖动URL地址自动获取功能,如图3所示.

图3 鼠标自动获取URL地址

4、程序设计进阶之一:使用文本窗格类显示网页文件的程序设计

上述程序设计仅仅实现了网页文件的下载,若想要一定的网页显示功能,则可利用面板组件中的“文本窗格”类来访问服务器,其主程序为WebClientJFrame.java。

从组件面板中选择“文本窗格”,安置到相应位置,去掉可编辑属性,界面布局如图4所示。

图4 一个简单的浏览器

 

在“发送”按钮中设置如下代码:

    IPaddress=jTextField1.getText();

        try {

//完成TCP连接、网页下载并呈现。

       jTextPane1.setPage(IPaddress);

     } catch (IOException ex) {  }

       

     若想窗口程序响应鼠标超链接动作,则在WebClientJFrame类定义中继承超级链接响应的接口:implements HyperlinkListener。

     在构造方法中添加超级链接监听方法,如鼠标移动、点击等,如:

    jTextPane1.addHyperlinkListener(this);

     在主程序中实现抽象方法hyperlinkUpdate(HyperlinkEvent evt),响应鼠标动作

还可以做成一个小小的浏览器程序:

 

页面显示:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        String IPAddress = jTextField1.getText();
    //    URL url=new URL(jTextField1.getText());
        try
        {
            URL url=new URL(jTextField1.getText());
           // jTextPane1.setPage(IPAddress);
           jTextPane1.setPage(url);
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }                     

点超链接:

 private void jTextPane1MouseClicked(java.awt.event.MouseEvent evt) {                                        
        jTextPane1.addHyperlinkListener(this);// TODO add your handling code here:
    }                                       

    private void jTextPane1MouseMoved(java.awt.event.MouseEvent evt) {                                      
            jTextPane1.addHyperlinkListener(this);// TODO add your handling code here:
    }                                     

超链接:

    @Override
    public void hyperlinkUpdate(HyperlinkEvent evt) {
      //  throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        try
        {
           if(evt.getClass() == FormSubmitEvent.class) //处理表单提交事件
           {
               FormSubmitEvent fevt = (FormSubmitEvent)evt;
               URL url = fevt.getURL();//获得URL
               String method = fevt.getMethod().toString();//获得请求方式
               String data = fevt.getData();//获得表单数据
               
               if(method.equals("GET"))//如果为Get方法
               {
                   jTextPane1.setPage(url.toString()+"?" + data);
                   jTextPane1.setText(url.toString() + "?" + data);
                   //把文本框设为用户选择的超级链接
                           
               }else
               {
                   if(method.equals("POST"))//如果为POST方法
                   {
                       URLConnection uc = url.openConnection();
                       //发送HTTP响应正文
                       uc.setDoOutput(true);
                       OutputStreamWriter out = new OutputStreamWriter(uc.getOutputStream());
                       out.write(data);
                       out.close();
                       
                       //接收HTTP响应报文
                       InputStream in = uc.getInputStream();
                       ByteArrayOutputStream buffer = new ByteArrayOutputStream();
                       byte[] buff = new byte[1024];
                       int len = -1;
                       
                       while((len =in.read(buff))!=-1)
                       {
                           buffer.write(buff,0,len);
                       }
                       in.close();
                       
                       jTextPane1.setText(new String(buffer.toByteArray()));
                       jTextField1.setText(url.toString()); //J将文本框设为用户选择的超级链接
                       
                   }
                   
                    System.out.println(fevt.getData() + "|" + fevt.getMethod() + "|" + fevt.getURL());
                  
               }
           }else
               
               if(evt.getEventType()== HyperlinkEvent.EventType.ACTIVATED)
           {//处理用户选择的超级链接
               jTextPane1.setPage(evt.getURL());
               jTextField1.setText(evt.getURL().toString());
           }
        }catch(Exception e1)
        {
            jTextPane1.setText(evt.getURL().toString());
            e1.printStackTrace();
        }
        
        
    }

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《互联网程序设计(Java)》——课程笔记10:Http程序设计 的相关文章

  • 在 Spring Boot 中重新加载/刷新缓存

    我正在使用 Spring Boot 对于缓存 我使用 Ehcache 到目前为止一切正常 但现在我必须重新加载 刷新 那么我该如何执行此操作 以便我的应用程序不会出现任何停机时间 我在Spring Ehcache中尝试了很多方法 但它不起作
  • SWIG 类型映射 uint8_t* 从 C/C++ 到 java.nio.ByteBuffer

    我正在尝试将输入和输出缓冲区从 C 传递给 java 类 出于效率原因 我需要使用 ByteBuffer 这两个缓冲区都是在 C 部分中分配的 我需要将它们传递给一个 java 函数 该函数将使用输入缓冲区进行一些计算并将结果写入输出缓冲区
  • 使用 Java-Large 文件查询 JSON 文件

    我正在尝试使用 java 解析下面的 JSON 文件 我需要能够 按 ID 或名称或对象中的任何字段搜索文件 也在字段中搜索空值 搜索应返回整个对象 该文件将会很大 并且搜索应该仍然很省时 id 1 name Mark Robb last
  • 使用 CXF 通过 HTTP 基本身份验证使用 Web 服务时出现 401 错误

    我正在尝试在 JUnit 测试中使用使用 HTTP 基本身份验证 使用 Apache CXF 的远程 Web 服务 我收到的错误是 javax xml ws WebServiceException Failed to access the
  • 逐行读取 JTextPane

    有没有办法读取a的内容JTextPane逐行 很像 BufferedReader 吗 Element root textPane getDocument getDefaultRootElement 获得根元素后 您可以检查存在多少个子元素
  • ORMLite - join where 子句中的括号

    我想使用连接三个表QueryBuilder join and QueryBuilder joinor但我想在 where 子句中添加括号 如下所示 WHERE first table where AND second table where
  • Eclipse 内容协助无法在枚举常量参数列表中工作

    使用 eclipse 当我输入以下内容时 public enum Foo A Integer private final Integer integer private Foo Integer integer this integer in
  • 带有 @Scheduled Spring 注释的方法的切入点

    我想要一个带有注释的方法的 AspectJ 切入点 Scheduled 尝试了不同的方法但没有任何效果 1 Pointcut execution org springframework scheduling annotation Sched
  • Android Studio 找不到 com.android.support:support-v4:19.1.0

    我已将一个项目导入Android Studio但我收到错误 找不到 com android support support v4 19 1 0 我在哪里可以找到这个文件 我已经使用导入了项目Gradle 我有Android Studio v
  • 大型 XML 的 XML 节点到字符串转换

    到目前为止我一直在使用DOM源在我的 Android 应用程序中将 XML 文件转换为字符串 这是我的代码 public String convertElementToString Node element throws Transform
  • JavaFX 动画使用循环?

    我正在尝试制作一款类似太空侵略者的游戏 我画了一个正方形 我想通过使用循环逐步向下移动它thread sleep 然而 正方形立即被绘制出来 我知道有可以使用的动画路径 但我想保持低水平并仅使用坐标系 有没有办法使用这样的循环来制作时间轴动
  • 基于Java模式分割字符串

    您好 我有以下模式的日志文件 2014 03 06 03 21 45 432 ERROR mfs pool 3 thread 19 dispatcher StatusNotification Error processing notific
  • 无法从 ViewPager 中的 Fragment 编辑 ActionBar 标题

    我有一个Activity它通过一个托管多个片段ViewPager 在活动的onCreate方法我使用以下代码来更改ActionBar title Toolbar toolbar findViewById R id toolbar setSu
  • C3P0:生产中未返回的连接超时?

    参数unreturnedConnectionTimeout给定时间段后未返回的连接超时 我正在尝试决定是否应该在我的制作中使用它persistence xml 使用它的一大优点是连接池将能够从泄漏的连接中恢复 一个很大的缺点是泄漏的连接将很
  • Android 以编程方式停止 toast 通知?

    有没有办法以编程方式停止 Toast 消息 假设我有一个按钮 单击它可以滚动 toast 消息 并且在 onclick 事件中我想停止队列中的所有消息并只显示新消息 我该怎么做 我的代码的简化版本如下 代码 public class Hel
  • 错误:列“this_.phitorsionangle”必须出现在 GROUP BY 子句中或在聚合函数中使用

    我在执行 sql 查询时遇到了一些问题 我正在使用 Hibernate Criteria 来构建查询 我通过按一定间隔 binSize 舍入值然后对它们进行分组来从数据库创建一些容器 当我直接在 SQL 中使用查询尝试时 效果非常好 SEL
  • org.apache.catalina.core.JreMemoryLeakPreventionListener 中急切调用 URLConnection 的 setDefaultUseCaches(false) 是什么原因

    这个问题可能有点难以找到答案 这是一个系列中的问题考虑使用 Policy getPolicy 的原因是什么 因为它将保留对上下文的静态引用并可能导致内存泄漏 https stackoverflow com questions 7057421
  • 从字符串中提取文本 Java

    使用此字符串 ADACADABRA 如何从java中的字符串 ADACADABRA 中提取 CADA 以及如何提取 和 之间的id从下面的链接 http www youtube nocookie com embed zaaU9lJ34c5
  • 飞碟 - html 实体未呈现

    我正在使用 Flying saucer lib 生成 pdf 但我对一些 html 实体有问题 我已经在寻找解决方案 我在这个论坛和其他地方找到了很多提示 但仍然存在问题 我尝试过这种方法 http sdtidbits blogspot c
  • JavaFX 中的 MVC 模式与场景生成器

    我是 JavaFX 新手 根据我当前的设置 正在努力创建合适的 MVC 架构 我使用 Scene Builder 单击了一个 UI 并指定了一个 Controller 类 Startup public class Portal extend

随机推荐

  • 项目中的外包团队如何管理

    在复杂的项目工作中 对外采购产品 服务变得越来越普遍 这种基于合同的跨组织合作方式 确实给项目的管理工作带来了更大的挑战 项目经理在管理好自己团队的同时 应该怎样做好针对外包团队的监督与控制工作呢 01 工作外包不等于甩包袱 首先需要明确的
  • QLabel中设置背景图片的4种方法

    1 图片不重复 可设置缩放比例 不可动态缩放 find package Qt QT VERSION MAJOR COMPONENTS Svg REQUIRED Qt QT VERSION MAJOR Svg include
  • 18、计算机图形学——BRDF与渲染方程

    一 BRDF Bidirectional Reflectance Distribution Function 双向反射分布函数 基于https blog csdn net Master Cui article details 1197877
  • 文件上传漏洞攻击与防范方法

    01 文件上传漏洞简介 文件上传漏洞是web安全中经常用到的一种漏洞形式 是对数据与代码分离原则的一种攻击 上传漏洞顾名思义 就是攻击者上传了一个可执行文件如木马 病毒 恶意脚本 WebShell等到服务器执行 并最终获得网站控制权限的高危
  • python接口自动化测试 ( 第一章 )

    python接口自动化测试 第一章 接口自动化测试实战 这是一个从0到1的过程 一步一步搭建的测试接口框架 本教程从开始写框架的思路 和实现过程深入解析 并且深入到了每个相关的的各个细节 不论你是刚入门的菜鸟 还是一个懂编码经验的工程师 相
  • OpenVX嵌入式图像处理(一)硬件平台及软件介绍

    图像处理这几年可谓是大红大紫了一番 尤其是OpenCV的出现让很多之前只有研究者才能使用的算法变成了小白装个库调用个函数就可以解决的问题 但是实时性一直以来都是一个非常头疼的问题 尤其是在嵌入式平台上进行图像处理的门槛一直以来都没有降低 今
  • 关于安装PotPlayer64出现PotPlayer 64 bit need right Try agin的问题

    首先官网下载 官网地址 http www potplayer org 根据自己的操作系统位数随便下载一个 进行安装 出现问题 没用admin权限 这时候你需要进行的操作是把当前窗口关闭 然后选中软件 右键选择以管理员身份运行 切记是以管理员
  • STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)

    目录 1 实验目的 2 实验效果 3 理论部分 3 1时钟源 3 2时基单元 3 3输入捕获 4 程序流程 4 1GPIO初始化结构体 4 2时基初始化结构体 4 3输出比较结构体 4 4刹车和死区结构体的初始化 5 程序源码 1 实验目的
  • roblox虚拟世界怎么做服务器,roblox虚拟世界

    游戏简介 roblox虚拟世界是一款像素风格模拟经营游戏 游戏采用简约的画面风格设定 超大的世界地图可以自由的探索 还可以收集丰富的物品资源进行创造 定制一个专属的秩序 游戏特色 1 游戏采用高清品质的画面 大家开自由的畅玩 2 随时随地一
  • 单片机蓝桥杯--数码管显示

    我们先来看一下蓝桥杯板中数码管部分的电路图 对于动态数码管的控制 是需要有段选和位选的 位选是控制数码管哪一位显示 段选是控制该位显示什么数字 由上图可知 当Y6C有效时 P0控制的是数码管的位 当Y7C有效时 可以给P0写入显示数字的断码
  • RedHat Enterprise下如何配置KVM虚拟机的网络网桥

    RedHat Enterprise下如何配置KVM虚拟机的网络网桥 一 网桥的相关创建命令 1 创建网桥设备 brctl addbr
  • 【Github】目标检测组会内容分享

    组会的内容展示为PPT PDF的形式 讲解目标检测领域比较重要的论文 比如R CNN SPP Net等经典论文 资料已经打包好上传到我的github仓库 仓库地址为 https github com biluko Object detect
  • Java后端内部面试题(前一部分)

    面试题 基础篇 1 Java 语言有哪些特点 1 简单易学 有丰富的类库 2 面向对象 Java 最重要的特性 让程序耦合度更低 内聚性更高 2 面向对象和面向过程的区别 面向过程 是分析解决问题的步骤 然后用函数把这些步骤一步一步地实现
  • python 遇到表情代码出错, 用正则表达式去掉表情代码

    gt gt gt aa U0001f60a adwkdkdkkdk 这里 U0001f60a 这是表情的代码 带这个 gt gt gt import re gt gt gt cc re compile r U0001f60a cc 就是需要
  • 小程序授权登录最新解决方案

    小程序授权登录最新解决方案 一 在WXML中设置单击事件 也可以直接放在第一个页面的ONLOAND函数中 用户进入小程序后自动弹出 二 在JS中设置Button的触发代码 三 演示 一 在WXML中设置单击事件 也可以直接放在第一个页面的O
  • SmartForms取消Word编辑器 恢复文本编辑器

    导语 在目前最新版本的 S 4 HANA 1909和2021版本中 SmartForms的文本编辑器改成了嵌套Word 而不是直接修改文本框的形式 这给很多电脑配置不是很高 或者Word兼容性有问题的开发带来了困难 下面说一下如何恢复到文本
  • Ruoyi用户菜单权限

    若依用户菜单权限 后端实现 首先如果想先要实现菜单权限 那么得现在后端添加一个与之对应的权限字段 这样就有权限字段了 前端实现 前端得需要调用这个权限字段的按钮 调用该权限字段的按钮 点击事件 接口请求 若依前端功能 这里得需要在ruoyi
  • page table 改进之 反置页表

    页表是把所有的逻辑页面放到一起 但随着进程的增加 逻辑页面会迅速增长 有多少页面页表就会有多少项 那么不变的是物理内存 为什么不给物理内存编号记录每一块存放了哪个进程呢
  • 【图像处理】图像检索的三种python实现(直方图/OpenCV/哈希法)

    简介 本文介绍了图像检索的三种实现方式 均用python完成 其中前两种基于直方图比较 哈希法基于像素分布 检索方式是 提前导入图片库作为检索范围 给出待检索的图片 将其与图片库中的图片进行比较 得出所有相似度后进行排序 从而检索结果为相似
  • 《互联网程序设计(Java)》——课程笔记10:Http程序设计

    1 概论 HTTP系统包括客户端软件 浏览器 和服务器软件 HTTP服务器 早期的客户端软件 其主要工作可理解为文件下载和文件显示 实际上现代的HTTP客户端比文件下载要复杂得多 它包括网页文件的下载 跨平台的本地显示 参数的传递 动态网页