C#完成简易的基于HTTP协议的浏览器客户端软件

C#完成简易的基于HTTP协议的浏览器客户端软件



任务摘要

学习“网络编程技术”参考书上“4.8.2 HTTP 客户端编程方法”,用C#完成一个简易图形界面的基于HTTP协议的浏览器客户端软件。


一、HTTP协议简介

定义
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送 WWW 方 式的数据,浏览器与 Web 服务器之间所遵循的网络通信协议就是 HTTP。
原理
HTTP 是一种基于客户机/服务器的请求/应答通信模式。一个客户机与 Web 服务器建立连接后,发送一个请求报文给服务器,服务器接到请求后,进行相应的操作后并返回响应报文给客户端浏览器。
HTTP请求
HTTP 请求报文内容:请求行、消息报头、请求正文
请求行格式:<Method> <Request-URI> <HTTP-Version> <CRLF>
消息报头主要包括接收的内容浏览器可以接受的字符编码集,可以支持的web服务器返回内容压缩编码类型,可接受的语言,HTTP 授权的授权证书 等。
HTTP响应
HTTP 响应报文内容:状态行、消息报头、响应正文
状态行格式:<HTTP-Version> <Status-Code> <Reason-Phrase> <CRLF>
HTTP 客户端编程方法

Socket
TcpListener
WebClient
用于网络客户端操作。
HttpWebRequest
用于获取和操作HTTP请求。
HttpWebResponse
用于获取和操作HTTP应答。
WebRequest
用于获取和操作Web请求。
WebResponse
用于获取和操作Web应答。
Uri
用于获取和操作网络资源位置。

二、项目创建

打开 VS2019,点击 创建新项目
在这里插入图片描述
选择 C# 的 “ Windows 窗体应用”,然后点击 “ 下一步 ”
在这里插入图片描述
输入项目名称,选择保存路径,然后点击 “ 创建 ”
在这里插入图片描述
界面如图
在这里插入图片描述

三、窗体创建

添加 MenuStrip 控件到窗口中,作为菜单栏,并添加如下的下拉选项
在这里插入图片描述
添加 ToolStrip 控件到窗口中,作为工具栏,如图
在这里插入图片描述
添加一些工具项
在这里插入图片描述
添加 StatusStrip 控件到窗口中,作为状态栏
在这里插入图片描述
添加 WebBrowser 控件到窗口中,作为网页的显示界面
在这里插入图片描述

四、代码编写

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WebShow
{
    
    
    public partial class Form1 : Form
    {
    
    
        public Form1()
        {
    
    
            InitializeComponent();
        }

        public Form1(string url)
        {
    
    
            InitializeComponent();

            // 打开用户主页.
            // 以下事件在设计器中不可见.
            webBrowser1.CanGoBackChanged +=
                new EventHandler(webBrowser1_CanGoBackChanged);
            webBrowser1.CanGoForwardChanged +=
                new EventHandler(webBrowser1_CanGoForwardChanged);
            webBrowser1.DocumentTitleChanged +=
                new EventHandler(webBrowser1_DocumentTitleChanged);
            webBrowser1.StatusTextChanged +=
                new EventHandler(webBrowser1_StatusTextChanged);

            if (url == string.Empty)
                webBrowser1.GoHome();
            else
                webBrowser1.Navigate(url);
        }

        //打开本地 html 文件
        private void ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
    
    
            OpenFileDialog ofd = new OpenFileDialog();//实例打开文件窗口对象
            ofd.Filter = "Htm文件(*.htm)|*.htm|Html文件(*.html)|*.html"; //设置“另存为文件类型”或“文件类型”框中出现的选择内容
            ofd.FilterIndex = 1; //设置默认显示文件类型为Jpg文件(*.jpg)|*.jpg
            ofd.Title = "选择Html文件"; //获取或设置文件对话框标题
            ofd.InitialDirectory = Application.StartupPath;
            ofd.RestoreDirectory = true;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
    
    
                toolStripTextBox1.Text = ofd.FileName;
            }
            else
            {
    
    
                return;
            }
        }

        //菜单栏——打印
        private void ToolStripMenuItem2_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.ShowPrintDialog();
        }

        //打印设置
        private void ToolStripMenuItem3_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.ShowPageSetupDialog();
        }

        //打印预览
        private void ToolStripMenuItem4_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.ShowPrintPreviewDialog();
        }

        //网页属性
        private void ToolStripMenuItem5_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.ShowPropertiesDialog();
        }

        //网页源码
        private void ToolStripMenuItem6_Click(object sender, EventArgs e)
        {
    
    
            // 显示网页源码的对话框显示出来
            CodeView dialogCodeView = new CodeView();
            dialogCodeView.Text = webBrowser1.Url.ToString() + " - 原始源";
            dialogCodeView.Show();

            // 把网页源码显示在弹出的窗口中
            // 首先解码
            //StreamReader reader = new StreamReader(webBrowser1.DocumentStream, Encoding.GetEncoding("GB2312"));
            //StreamReader reader = new StreamReader(webBrowser1.DocumentStream, Encoding.UTF8);
            StreamReader reader = new StreamReader(webBrowser1.DocumentStream, Encoding.Default);
            dialogCodeView.sourceCode = reader.ReadToEnd();
            reader.Close();
        }

        //另存为
        private void ToolStripMenuItem7_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.ShowSaveAsDialog();
        }

        //退出
        private void ToolStripMenuItem8_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.Dispose();
            Application.Exit();
        }

        //后退
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.GoBack();
        }

        //前进
        private void toolStripButton2_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.GoForward();
        }

        //主页
        private void toolStripButton3_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.GoHome();
        }

        //刷新
        private void toolStripButton4_Click(object sender, EventArgs e)
        {
    
    
            // 如果地址为 "about:blank" , 避免刷新.
            if (!webBrowser1.Url.Equals("about:blank"))
                webBrowser1.Refresh();
        }

        //前往
        private void toolStripButton5_Click(object sender, EventArgs e)
        {
    
    
            Navigate(toolStripTextBox1.Text);
        }

        //停止
        private void toolStripButton6_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.Stop();
        }

        //搜索
        private void toolStripButton7_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.GoSearch();
        }

        //工具栏——打印
        private void toolStripButton8_Click(object sender, EventArgs e)
        {
    
    
            webBrowser1.Print();
        }

        //文本框
        private void toolStripTextBox1_Click(object sender, EventArgs e)
        {
    
    
            toolStripTextBox1.SelectAll();
        }
        //文本框
        private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
        {
    
    
            if (e.KeyCode == Keys.Enter)
            {
    
    
                Navigate(toolStripTextBox1.Text);
            }
        }

        private void Navigate(String address)
        {
    
    
            if (String.IsNullOrEmpty(address)) return;
            if (address.Equals("about:blank")) return;
            try
            {
    
    
                webBrowser1.Navigate(new Uri(address));
            }
            catch (System.UriFormatException)
            {
    
    
                return;
            }
        }

        private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
    
    
            toolStripTextBox1.Text = webBrowser1.Url.ToString();
        }

        private void webBrowser1_CanGoBackChanged(object sender, EventArgs e)
        {
    
    
            toolStripButton1.Enabled = webBrowser1.CanGoBack;
        }

        private void webBrowser1_CanGoForwardChanged(object sender, EventArgs e)
        {
    
    
            toolStripButton2.Enabled = webBrowser1.CanGoForward;
        }

        // 用当前网页文档的标题取代窗口标题.
        private void webBrowser1_DocumentTitleChanged(object sender, EventArgs e)
        {
    
    
            this.Text = webBrowser1.DocumentTitle;
        }

        private void webBrowser1_StatusTextChanged(object sender, EventArgs e)
        {
    
    
            toolStripStatusLabel1.Text = webBrowser1.StatusText;
        }

        // 单击程序中某个链接后会打开新窗口,此时就会执行NewWinow事件中的代码
        // 通过此事件中的代码将打开新窗口中内容添加到本软件的webBrowser控件中显示
        // 实现网页用我们自定义的浏览器显示
        private void webBrowser1_NewWindow(object sender, System.ComponentModel.CancelEventArgs e)
        {
    
    
            string newURL = webBrowser1.StatusText;
            Form1 newform = new Form1(newURL);
            newform.toolStripStatusLabel1.Text = "正在打开网页 " + newURL + " ...";
            newform.Show();
            // 使其他浏览器无法捕获此事件
            // 阻止了其他浏览器显示网页,而是采用我们自定义的浏览器来显示
            e.Cancel = true;
        }
    }
}

结果显示
在这里插入图片描述


五、总结

对 webBrowser 控件的使用还不太熟悉,还是多百度百度才能掌握,在网页显示方面,webBrowser 控件给程序员带来了极大的便利。对于不懂得地方,可以多查阅资料。

六、参考资料

C# WebBrowser简易浏览器Demo.

猜你喜欢

转载自blog.csdn.net/QWERTYzxw/article/details/112253072