• C#网络编程概述 三


    最后,我就综合以上C#网络编程的一些知识,向大家展示一个很好的实例。该实例是一个运用Socket的基于同步模式的客户端应用程序,它首先通过解析服务器的IP地址建立一个终结点,同时创建一个基于流套接字的Socket连接,其运用的协议是TCP协议。通过该Socket就可以发送获取网页的命令,再通过该Socket获得服务器上默认的网页,最后通过文件流将获得的数据写入本机文件。这样就完成了网页的下载工作了,程序运行的效果如下所示:



    源代码如下:(其中主要的函数为DoSocketGet())

    using System;

    using System.Drawing;

    using System.Collections;

    using System.ComponentModel;

    using System.Windows.Forms;

    using System.Data;

    using System.Net;

    using System.Net.Sockets;

    using System.Text;

    using System.IO;



    namespace SocketSample

    {

    ///

    /// Form1 的摘要说明。

    ///


    public class Form1 : System.Windows.Forms.Form

    {

    private System.Windows.Forms.Label label1;

    private System.Windows.Forms.Label label2;

    private System.Windows.Forms.Button Download;

    private System.Windows.Forms.TextBox ServerAddress;

    private System.Windows.Forms.TextBox Filename;

    ///

    /// 必需的设计器变量。

    ///


    private System.ComponentModel.Container components = null;



    public Form1()

    {

    //

    // Windows 窗体设计器支持所必需的

    //

    InitializeComponent();



    //

    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码

    //

    }



    ///

    /// 清理所有正在使用的资源。

    ///


    protected override void Dispose( bool disposing )

    {

    if( disposing )

    {

    if (components != null)

    {

    components.Dispose();

    }

    }

    base.Dispose( disposing );

    }



    #region Windows Form Designer generated code

    ///

    /// 设计器支持所需的方法 - 不要使用代码编辑器修改

    /// 此方法的内容。

    ///


    private void InitializeComponent()

    {

    this.label1 = new System.Windows.Forms.Label();

    this.label2 = new System.Windows.Forms.Label();

    this.Download = new System.Windows.Forms.Button();

    this.ServerAddress = new System.Windows.Forms.TextBox();

    this.Filename = new System.Windows.Forms.TextBox();

    this.SuspendLayout();

    //

    // label1

    //

    this.label1.Location = new System.Drawing.Point(16, 24);

    this.label1.Name = "label1";

    this.label1.Size = new System.Drawing.Size(80, 23);

    this.label1.TabIndex = 0;

    this.label1.Text = "服务器地址:";

    this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;

    //

    // label2

    //

    this.label2.Location = new System.Drawing.Point(16, 64);

    this.label2.Name = "label2";

    this.label2.Size = new System.Drawing.Size(80, 23);

    this.label2.TabIndex = 1;

    this.label2.Text = "本地文件名:";

    this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;

    //

    // Download

    //

    this.Download.Location = new System.Drawing.Point(288, 24);

    this.Download.Name = "Download";

    this.Download.TabIndex = 2;

    this.Download.Text = "开始下载";

    this.Download.Click += new System.EventHandler(this.Download_Click);

    //

    // ServerAddress

    //

    this.ServerAddress.Location = new System.Drawing.Point(96, 24);

    this.ServerAddress.Name = "ServerAddress";

    this.ServerAddress.Size = new System.Drawing.Size(176, 21);

    this.ServerAddress.TabIndex = 3;

    this.ServerAddress.Text = "";

    //

    // Filename

    //

    this.Filename.Location = new System.Drawing.Point(96, 64);

    this.Filename.Name = "Filename";

    this.Filename.Size = new System.Drawing.Size(176, 21);

    this.Filename.TabIndex = 4;

    this.Filename.Text = "";

    //

    // Form1

    //

    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

    this.ClientSize = new System.Drawing.Size(376, 117);

    this.Controls.AddRange(new System.Windows.Forms.Control[] {

    this.Filename,

    this.ServerAddress,

    this.Download,

    this.label2,

    this.label1});

    this.Name = "Form1";

    this.Text = "网页下载器";

    this.ResumeLayout(false);



    }

    #endregion



    ///

    /// 应用程序的主入口点。

    ///


    [STAThread]

    static void Main()

    {

    Application.Run(new Form1());

    }



    private string DoSocketGet(string server)

    {

    //定义一些必要的变量以及一条要发送到服务器的字符串

    Encoding ASCII = Encoding.ASCII;

    string Get = "GET / HTTP/1.1\r\nHost: " + server +

    "\r\nConnection: Close\r\n\r\n";

    Byte[] ByteGet = ASCII.GetBytes(Get);

    Byte[] RecvBytes = new Byte[256];

    String strRetPage = null;



    //获取服务器相关的IP地址列表,其中第一项即为我们所需的

    IPAddress hostadd = Dns.Resolve(server).AddressList[0];



    //根据获得的服务器的IP地址创建一个终结点,端口为默认的80

    IPEndPoint EPhost = new IPEndPoint(hostadd, 80);



    //创建一个Socket实例

    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,

    ProtocolType.Tcp );



    try

    {

    //用上面所取得的终结点连接到服务器

    s.Connect(EPhost);

    }

    catch(Exception se)

    {

    MessageBox.Show("连接错误:"+se.Message,"提示信息",

    MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);

    }



    if (!s.Connected)

    {

    strRetPage = "不能连接到服务器!";

    return strRetPage;

    }



    try

    {

    //向服务器发送GET命令

    s.Send(ByteGet, ByteGet.Length, SocketFlags.None);

    }

    catch(Exception ce)

    {

    MessageBox.Show("发送错误:"+ce.Message,"提示信息",

    MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);

    }



    //接收页面数据,直到所有字节接收完毕

    Int32 bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);

    strRetPage = "以下是在服务器" + server + "上的默认网页:\r\n";

    strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, bytes);



    while (bytes > 0)

    {

    bytes = s.Receive(RecvBytes, RecvBytes.Length, SocketFlags.None);

    strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, bytes);

    }



    //禁用并关闭Socket实例

    s.Shutdown(SocketShutdown.Both);

    s.Close();



    return strRetPage;

    }



    private void Download_Click(object sender, System.EventArgs e)

    {

    //将所读取的字符串转换为字节数组

    byte[] content=Encoding.ASCII.GetBytes(DoSocketGet(ServerAddress.Text));

    try

    {

    //创建文件流对象实例

    FileStream fs=new FileStream(Filename.Text,FileMode.OpenOrCreate,FileAccess.ReadWrite);

    //写入文件

    fs.Write(content,0,content.Length);

    }

    catch(Exception fe)

    {

    MessageBox.Show("文件创建/写入错误:"+fe.Message,"提示信息",MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);

    }

    }

    }

    }



    以上程序在Windows 2000服务器版、Visual Studio.Net中文正式版下调试通过
  • 相关阅读:
    pyc文件是什么【转载】
    Linux下的python等操作【转载】
    P1012 拼数 字符串
    P1309 瑞士轮 排序选择 时间限制 归并排序
    商业竞争 三分+背包
    老虎ji 剪枝模拟
    交通灯 并查集
    三色抽卡游戏 博弈论nim
    质数串 乱搞
    自动驾驶系统 bfs
  • 原文地址:https://www.cnblogs.com/xh831213/p/329639.html
Copyright © 2020-2023  润新知