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 控件给程序员带来了极大的便利。对于不懂得地方,可以多查阅资料。