C#网络编程

1.WebClient

(1)WebClient类的主要方法

DownloadXXX()方法:下载URI资源文件

OpenXXX()方法:打开URI资源流

UploadXXX()方法:上传资源到URI

(2)DownloadData()方法

    class Program

    {

        static void Main(string[] args)

        {

            WebClient web = new WebClient();

            byte[] temp = web.DownloadData("http://www.baidu.com");//下载URI资源文件

            string Response = Encoding.UTF8.GetString(temp);//解码

            Console.WriteLine(Response);

            Console.Read();

        }

    }

(3)OpenRead()方法

    class Program

    {

        static void Main(string[] args)

        {

            WebClient web = new WebClient();

            Stream st = web.OpenRead("http://www.baidu.com");//打开URI资源流

            StreamReader sr = new StreamReader(st);

            string Response = sr.ReadToEnd();

            Console.WriteLine(Response);

            Console.Read();

        }

    }

(4)UploadData()方法

    class Program

    {

        static void Main(string[] args)

        {

            WebClient web = new WebClient();

            string str = "李志伟";

            byte[] response =

web.UploadData("http://www.baidu.com"Encoding.Default.GetBytes(str));

            Console.WriteLine(Encoding.Default.GetString(response));//解码

            Console.Read();

        }

}

上传数据时出现问题,百度报错!这是因为没有权限。

(5)总结WebClient

虽然WebClient类使用简单,但是其功能有限,特别是不能使用它提供身份验证证书。这样,在上传数据时问题就出现了,许多站点不接受没有身份验证的上传文件。这是由于WebClient类是非常一般的类,可以使用任意协议发送请求和接受响应(如:HTTP、FTP等)。但它不能处理特定于任何协议的任何特性,例如,专用于HTTP的cookie。如果想利用这些特性就需要使用WebRequest类与WebResponse类为基类的一系列类。

2.WebRequest类与WebResponse

(1)WebRequest类与WebResponse类简介

WebRequest类与WebResponse类是抽象类,其子类对象代表某个特定URI协议的请求对象或响应对象。调用WebRequest.Create()方法得到WebResponse对象。调用WebResponse对象的GetResponse()方法得到WebResponse对象。

(2)使用示例

    class Program

    {

        static void Main(string[] args)

        {

            WebRequest req = WebRequest.Create("http://www.baidu.com");//得到请求对象

            WebResponse res = req.GetResponse();//得到相应对象

            Stream strm = res.GetResponseStream();//得到相应数据流

            StreamReader sr = new StreamReader(strm);

            Console.WriteLine(sr.ReadToEnd());

            Console.Read();

        }

    }

(3)WebRequest类与WebResponse类的子类(继承结构)

C#网络编程_第1张图片

(4)HttpWebRequest类与HttpWebResponse类使用示例

    class Program

    {

        static void Main(string[] args)

        {

            string uri = "http://www.baidu.com";

            HttpWebRequest httpRe = (HttpWebRequest)HttpWebRequest.Create(uri);

            HttpWebResponse httpRes = (HttpWebResponse)httpRe.GetResponse();

            Stream strm = httpRes.GetResponseStream();//得到相应数据流

            StreamReader sr = new StreamReader(strm);

            Console.WriteLine(sr.ReadToEnd());

            Console.Read();

        }

}

这里以HTTP协议为例使用了对应了类,其他协议的类的使用方法与此类似。

(5)身份验证

如果需要把身份验证证书附带在请求中,就使用WebRequest类中的Credentials属性。

    class Program

    {

        static void Main(string[] args)

        {

            WebRequest req = WebRequest.Create("http://www.baidu.com");//得到请求对象

            NetworkCredential cred = new NetworkCredential("userName""password");

            req.Credentials = cred;//调用GetResponse()之前赋值

            WebResponse res = req.GetResponse();//得到相应对象

            Stream strm = res.GetResponseStream();//得到相应数据流

            StreamReader sr = new StreamReader(strm);

            Console.WriteLine(sr.ReadToEnd());

            Console.Read();

        }

    }

(6)使用代理

使用代理服务器需要用到WebRequest类中的Proxy属性,以及WebProxy对象。

    class Program

    {

        static void Main(string[] args)

        {

            WebRequest req = WebRequest.Create("http://www.baidu.com");//得到请求对象

            NetworkCredential cred = new NetworkCredential("userName""password","Domain");

            WebProxy wp = new WebProxy("192.168.1.100"true);//设置代理服务器地址

            req.Credentials = cred;//调用GetResponse()之前赋值

            req.Proxy = wp;//调用GetResponse()之前赋值

            WebResponse res = req.GetResponse();//得到相应对象

            Stream strm = res.GetResponseStream();//得到相应数据流

            StreamReader sr = new StreamReader(strm);

            Console.WriteLine(sr.ReadToEnd());

            Console.Read();

        }

    }

(7)异步请求

若需要使用异步请求,就可以使用BeginGetRequestStream()、EndGetRequestStream()与BeginGetResponse()、EndGetResponse()方法。使用异步请求就不需要等待请求的响应,主线程不必阻塞可以直接向下执行。示例如下:

    class Program

    {

        static void Main(string[] args)

        {

            WebRequest req = WebRequest.Create("http://www.baidu.com");//得到请求对象

            req.BeginGetResponse(new AsyncCallback(Callback), req);//得到相应对象

            Console.WriteLine("异步请求已发送...");

            Console.Read();

        }

        //回调函数

        private static void Callback(IAsyncResult ar)

        {

            Thread.Sleep(5000);//休眠5

            WebRequest req = (WebRequest)ar.AsyncState;

            WebResponse res = req.EndGetResponse(ar);

            Stream strm = res.GetResponseStream();//得到相应数据流

            StreamReader sr = new StreamReader(strm);

            Console.WriteLine(sr.ReadToEnd());

        }

    }

3.WebBrowser控件

(1)使用WebBrowser控件

使用WebBrowser控件非常简单,如下图:

C#网络编程_第2张图片 C#网络编程_第3张图片

其按钮的单击事件代码如下:

        private void button1_Click(object sender, EventArgs e)//按钮事件

        {

            this.webBrowser1.Navigate("http://www.baidu.com");//加载文档

        }

(2)WebBrowser控件常用属性、方法与事件

WebBrowser控件常用的方法:Navigate():加载URI页面,GoBack():后退,GoForward():前进,Refresh():刷新,Stop():停止,GoHome():浏览主页。

WebBrowser控件的常用属性:Document:获取当前正在浏览的文档,DocumentTitle:获取当前正在浏览的网页标题,StatusText:获取当前状态栏的文本,Url:获取当前正在浏览的网址的Uri,ReadyState:获取浏览的状态。

WebBrowser控件的常用事件:DocumentCompleted:在WebBrowser控件完成加载文档时发生,XXXChanged:在XXX属性值更改时发生。

注意:得到了Document属性就可以直接操作网页里的元素了!

4.网络工具类(URL、IP、DNS)

(1)Uri与UriBuilder

Uri与UriBuilder类的主要区别是:Uri提供了很多只读属性,Uri对象被创建后就不能修改了;而UriBuilder类的属性较少,只允许构建一个完整的URI,这些属性可读写。

    class Program

    {

        static void Main(string[] args)

        {

            Uri uri = new Uri("http://www.baidu.com/s?wd=URI");

            //只读属性,Uri对象被创建后就不能修改了

            Console.WriteLine(uri.Query);//获取指定URI中包括的任何查询信息:?wd=URI

            Console.WriteLine(uri.AbsolutePath);//获取 URI 的绝对路径:/s

            Console.WriteLine(uri.Scheme);//获取此 URI 的方案名称:http

            Console.WriteLine(uri.Port);//获取此 URI 的端口号:80

            Console.WriteLine(uri.Host);//获取此实例的主机部分:www.baidu.com

            Console.WriteLine(uri.IsDefaultPort);//URI的端口值是否为此方案的默认值:true

            //创建UriBuilder对象,并给其属性赋值

            UriBuilder urib = new UriBuilder();

            urib.Host = uri.Host;

            urib.Scheme = uri.Scheme;

            urib.Path = uri.AbsolutePath;

            urib.Port = uri.Port;

            //测试

            UriTest(uri);//使用Uri对象

            UriTest(urib.Uri);//使用UriBuilder对象

            Console.Read();

        }

        //测试Uri对象

        static void UriTest(Uri uri)

        {

            Console.WriteLine("==============" + uri + "开始===============");

            Thread.Sleep(5000);

            HttpWebRequest httpweb = (HttpWebRequest)HttpWebRequest.Create(uri);

            HttpWebResponse res = (HttpWebResponse)httpweb.GetResponse();

            Stream stream = res.GetResponseStream();

            StreamReader strread = new StreamReader(stream);

            Console.WriteLine(strread.ReadToEnd());

            Console.WriteLine("======================完成===================\n\n\n\n");

        }

    }

(2)IPAddress、IPHostEntry 与Dns

IPAddress类提供了对IP地址的转换、处理等功能。IPHostEntry类的实例对象中包含了Internet主机的相关信息。Dns类提供了一系列静态的方法,用于获取提供本地或远程域名等功能。

    class Program

    {

        static void Main(string[] args)

        {

            //IPAddress类提供了对IP地址的转换、处理等功能

            IPAddress ip =IPAddress.Parse("202.108.22.5");//百度的IP

            byte[] bit = ip.GetAddressBytes();

            foreach (byte b in bit)

            {

                Console.Write(b+"  ");

            }

            Console.WriteLine("\n"+ip.ToString()+"\n\n");

            //IPHostEntry类的实例对象中包含了Internet主机的相关信息

            IPHostEntry iphe = Dns.GetHostEntry("www.microsoft.com");

            Console.WriteLine("www.microsoft.com主机DNS名:" + iphe.HostName);

            foreach (IPAddress address in iphe.AddressList)

            {

                Console.WriteLine("关联IP:"+address);

            }

            Console.WriteLine("\n");

            //Dns类提供了一系列静态的方法,用于获取提供本地或远程域名等功能

            iphe = Dns.GetHostEntry(Dns.GetHostName());

            Console.WriteLine("本地计算机名:" + iphe.HostName);

            foreach (IPAddress address in iphe.AddressList)

            {

                Console.WriteLine("关联IP:" + address);

            }

            Console.Read();

        }

    }

(3)解码与编码(Encoding)

    class Program

    {

        static void Main(string[] args)

        {

            Encoding utf8 = Encoding.UTF8;

            Encoding gb2312 = Encoding.GetEncoding("GB2312");

            //编码

            string test = "编码解码测试  ABCDabcd!";

            char[] source = test.ToCharArray();

            int len = utf8.GetByteCount(source, 0, test.Length);

            byte[] result = new byte[len];

            utf8.GetBytes(source, 0, test.Length, result, 0);

            foreach (byte b in result)

            {

                Console.Write("{0:X}", b);//16进制显示

            }

            Console.WriteLine();

            //解码

            Console.WriteLine(utf8.GetString(result));//输出字符串

            //得到所有系统编码

            EncodingInfo[] encodings = Encoding.GetEncodings();

            foreach (EncodingInfo e in encodings)

            {

                Console.WriteLine(e.Name);

            }

            //将URI地址进行编码

            Console.WriteLine(Uri.EscapeUriString("http://www.baidu.com/s?wd=李志伟"));

            //使用HttpUtility类进行编码与解码

            string temp = HttpUtility.UrlEncode("李志伟", gb2312);

            Console.WriteLine(temp + "-->" + HttpUtility.UrlDecode(temp, gb2312));

            Console.Read();

        }

    }

5.底层的网络协议类

(1)Socket

Socket:实现 Berkeley 套接字接口。

客户端代码:

    class Program

    {

        static void Main(string[] args)

        {

            Thread.Sleep(1000 * 2);

            Socket client = new Socket(AddressFamily.InterNetwork,

SocketType.Stream, ProtocolType.Tcp);

            //服务器的IP和端口

            IPEndPoint ie = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);

            client.Connect(ie);//连接服务端

            byte[] data = new byte[1024];

            int recv = client.Receive(data);//接收消息

            Console.WriteLine(Encoding.UTF8.GetString(data, 0, recv));

            for (int i = 0; i < 20; i++)

            {

                client.Send(Encoding.UTF8.GetBytes(i + ":李志伟发送的消息!\n"));

                Console.WriteLine("发送消息数:" + i);

                Thread.Sleep(1000);

            }

            client.Shutdown(SocketShutdown.Both);//断开连接

            client.Close();

            Console.WriteLine("连接已断开!");

            Console.Read();

        }

}

服务端代码:

    class Program

    {

        static void Main(string[] args)

        {

            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);

            Socket sock = new Socket(AddressFamily.InterNetwork,

SocketType.Stream, ProtocolType.Tcp);

            sock.Bind(ipep);//设置监听地址

            sock.Listen(10);//监听

            Console.WriteLine("已监听...");

            while (true)

            {

                Socket client = sock.Accept();//连接客户端

                Console.WriteLine("连接成功:" + client.RemoteEndPoint.ToString() + " -->" +

client.LocalEndPoint.ToString());

                byte[] data = Encoding.UTF8.GetBytes("欢迎!!!");

                client.Send(data, data.Length, SocketFlags.None);//给客户端发送信息

                //不断的从客户端获取信息

                while (client.Connected)

                {

                    data = new byte[1024];

                    int recv = client.Receive(data);

                    Console.WriteLine(Encoding.UTF8.GetString(data, 0, recv));

                }

                client.Close();

            }

            sock.Close();

        }

    }

(2)NetworkStream、TcpClient与TcpListener

NetworkStream:提供用于网络访问的基础数据流。TcpClient:为TCP网络服务提供客户端连接。TcpListener:从TCP网络客户端侦听连接。

客户端代码:

    class Program

    {

        static void Main(string[] args)

        {

            Thread.Sleep(1000 * 2);

            for (int i = 0; i < 20; i++)

            {

                TcpClient tcpClient = new TcpClient();

                tcpClient.Connect(IPAddress.Parse("127.0.0.1"), 9999);

                Console.WriteLine(i + ":连接成功!");

                NetworkStream ns = tcpClient.GetStream();//打开流

                Byte[] sendBytes = Encoding.UTF8.GetBytes(i + ":李志伟发送的消息!\n");

                ns.Write(sendBytes, 0, sendBytes.Length);

                ns.Dispose();//释放流

                tcpClient.Close();//释放连接

                Console.WriteLine("已发送消息数:" + i);

                Thread.Sleep(1000);

            }

            Console.Read();

        }

}

服务端代码:

    class Program

    {

        static void Main(string[] args)

        {

            IPAddress ip = IPAddress.Parse("127.0.0.1");

            TcpListener listener = new TcpListener(ip, 9999);//IP地址与端口号

            listener.Start();// 开始侦听

            Console.WriteLine("已开始侦听...");

            while (true)

            {

                TcpClient client = listener.AcceptTcpClient();//接受挂起的连接请求

                Console.WriteLine("连接成功{0}-->{1}",

client.Client.RemoteEndPoint.ToString(),

client.Client.LocalEndPoint.ToString());

                NetworkStream ns = client.GetStream();

                StreamReader sread = new StreamReader(ns);

                Console.WriteLine(sread.ReadToEnd());

            }

        }

}

注意:TcpClient.Client属性就是Socket对象!

(3)UdpClient

UdpClient:提供用户数据报 (UDP) 网络服务。

发送端代码:

    class Program

    {

        static void Main(string[] args)

        {

            Thread.Sleep(1000 * 2);

            UdpClient udpClient = new UdpClient();

            udpClient.Connect(IPAddress.Parse("127.0.0.1"), 9999);//连接

            for (int i = 0; i < 20; i++)

            {

                Byte[] data = Encoding.UTF8.GetBytes(i + ":李志伟发送的消息!");

                udpClient.Send(data, data.Length);//发送数据

                Console.WriteLine("发送消息数:" + i);

                Thread.Sleep(1000);

            }

            udpClient.Close();

            Console.Read();

        }

    }

接收端代码:

    class Program

    {

        static void Main(string[] args)

        {

            UdpClient udpClient = new UdpClient(9999);

            Console.WriteLine("已监听...");

            IPEndPoint RemoteIpEndPoint = null;

            while (true)//不断地接收数据

            {

                byte[] data = udpClient.Receive(ref RemoteIpEndPoint);//接收数据

                string str = Encoding.UTF8.GetString(data);

                Console.WriteLine("收到消息:" + str);

                Console.WriteLine("消息来源:" + RemoteIpEndPoint.ToString()+"\n");

            }

        }

    }

(4)SmtpClient

SmtpClient类是用来发送邮件的,它在System.Web.Mail命名空间下。调用SmtpClient类的send(newMessage)方法,其中的参数newMessage是一个MailMessage对象,所以我们在调用send(newMessage)方法前,须实例化MailMessage类,然后对newMessage的属性设值。

    class Program

    {

        static void Main(string[] args)

        {

            SmtpClient smtp = new SmtpClient();

            MailMessage mail = new MailMessage("XXX@163.com""XXXXXX@qq.com");

            //图像附件

            Attachment attach = new Attachment(@"F:\图片.jpg"MediaTypeNames.Image.Jpeg);

            //设置ContentId

            attach.ContentId = "pic";

            //ZIP附件

            Attachment attach2 =

new Attachment(@"F:\图片.rar""application/x-zip-compressed");

            mail.Attachments.Add(attach);//添加附件

            mail.Attachments.Add(attach2);//添加附件

            //标题和内容,注意设置编码,因为默认编码是ASCII

            mail.Subject = "你好";

            mail.SubjectEncoding = Encoding.UTF8;

            //HTML内容

            mail.Body = "<img src=\"cid:pic\"/><p>来自李志伟。</p>";

            mail.BodyEncoding = Encoding.UTF8;

            //指示改电子邮件内容是HTML格式

            mail.IsBodyHtml = true;

            //SMTP设置(根据邮箱类型设置,这里是163 Mail的SMTP服务器地址)

            smtp.Host = "smtp.163.com";

            smtp.UseDefaultCredentials = false;

            //某些SMTP服务器可能不支持SSL,会抛出异常

            smtp.EnableSsl = true;

            smtp.Credentials = new NetworkCredential("XXX@163.com""password");

            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;

            //发送

            smtp.Send(mail);

            Console.WriteLine("=============OK=============");

            Console.Read();

        }

    }


转载于:http://www.cnblogs.com/LiZhiW/p/3539846.html

你可能感兴趣的:(C#网络编程)