C#学习笔记 ----网络(第24章)----示例代码

URI (Uniform Resource Identifier,统一资源标识符)

 

System.Net.WebClient 请求文件

.NET Framework 目前支持以http:、https:和file:标识符开头的URI

 

WebClient下载方法,DownloadFile()

WebClient Client = new WebClient();
Client.DownloadFile("http://www.reuters.com","ReutesHomepage.htm");

WebClient 从Web站点检索数据方法,OpenRead()

WebClient Client = new WebClient();
Stream strm = Client.OpenRead("http://www.reuters.com");

WebClient OpenWrite()

WebClient webClient = new WebClient();
Stream stream = webClient.OpenWrite("http://localhost/accept/newfile.txt","PUT");
StreamWriter streamWriter = new StreamWriter(stream);
streamWriter.WriteLine("Hello World");
streamWriter.Close();

WebClient UploadFile()和UploadData()

WebClient client = new WebClient();
client.UploadFile("http://www.ourwebsite.com/NewFile.htm","C:\\WebSiteFiles\\NewFile.htm");
byte[] image;
//code to initialize image so it contains all the binary data for
client.UploadData("http://www.ourwebsite.com/NewFile.jpg",image);

 

WebRequest类、WebResponse类

WebRequest类代表要给某个特定URI发送信息的请求,URI作为参数传递给Create()方法

WebResponse类代表从服务器检索的数据。调用WebRequest.GetResponse()方法,实际上是把请求发给Web服务器,并创建一个Response对象,以检查返回的数据。

与WebClient对象一样,可以得到一个代表数据的数据流,使用WebResponse.GetResponseStream()方法获得。

WebRequest wrq = WebRequest.Create("http://www.reuters.com");
WebResponse wrs = wrq.GetResponse();
Stream strm = wrs.GetResponseStream();
StreamReader sr = new StreamReader(strm);
string line;

while((line = sr.ReadLine()) != null)
{
    listBox1.Items.Add(line);
}

strm.Close();

Timeout属性  控制WebRequest对象在抛出WebException异常之前等待相应的响应时间

WebException.Status属性  查看产生异常的原因

KeepAlive属性  通过HttpWebRequest,允许多个请求使用同一个连接,在后续的请求中节省关闭和重新打开连接的时间

AllowAutoRedirect属性  专用于HttpWebRequest,使用这个属性可以控制Web请求是否应自动跟随Web服务器上的重定向响应

Credentials属性  身份验证

NetworkCredential myCred = new NetworkCredential("myusername","mypassword");
wrq.Credentials = myCred;

使用代理,需要使用WebProxy对象

WebProxy wp = new WebProxy("192.168.1.100",true);
wp.Credentials = new NetworkCredential("user1","user1Password");
WebRequest wrq = WebRequest.Create("http://www.reuters.com");
wrq.Proxy = wp;
WebResponse wrs = wrq.GetResponse();

除了证书,还需要设计用户的域

WebProxy wp = new WebProxy("192.168.1.100",true);
wp.Credentials = new NetworkCredential("user1","user1Password","myDomain");
WebRequest wrq = WebRequest.Create("http://www.reuters.com");
wrq.Proxy = wp;
WebResponse wrs = wrq.GetResponse();

可以异步请求页面,使用BeginGetResponse()方法和EndGetResponse()方法

WebRequest wrq = WebRequest.Create("http://www.reuters.com");
wrq.BeginGetResponse(new AsyncCallback(OnResponse),wrq);

 

WebBrowser控件

非WebBrowse控件,使用System.Diagnostics名称空间中的Process打开Web页

Process myProcess = new Process();
myProcess.StartInfo.FileName = "iexplore.exe";
myProcess.StartInfo.Arguments = "http://www.wrox.com";
myProcess.Start();

 

使用LinkLabel控件

private void linkLabel1_LinkClicked(object sender,LinkLabelLinkClickedEventArgs e)
{
    WebBrowser wb = new WebBrowser();
    wb.Navigate("http://www.wrox.com",true);
}

WebBrowser控件的Navigated事件

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

WebBrowser控件的GoBack()方法、GoForward()方法、Stop()、Refresh()和GoHome()方法

WebBrowser控件的Print()

WebBrowser wb = new WebBrowser();
wb.Navigate("http://www.wrox.com");
wb.Print();

 

实用工具类

Uri和UriBuilder是System名称空间中的两个类,用于表示URI。

Uri提供只读属性,UriBuilder属性可读写

 

IPAddress类代表IP地址

IPAddress ipAddress = IPAddress.Parse("234.56.78.9");
byte[] address = ipAddress.GetAddressBytes();
string ipString = ipAddress.ToString();

IPHostEntry类  封装与某台特定的主机相关的信息

Dns类  能够与默认的DNS服务器进行通信,Dns类有两个重要的静态方法:Resolve()方法和GetHostByAddress()方法

IPHostEntry wroxHost = Dns.Resolve("www.wrox.com");
IPHostEntry wroxHostCopy = Dns.GetHostByAddress("208.215.179.178");

 

System.Net.Sockets

Socket  这个底层的类用于管理连接。WebRequest、TcpClient和UdpClient等类在内部使用这个类

NetworkStream  这个类是从Stream派生的,它表示来自网络的数据流

SmtpClient  允许通过SMTP发送消息(邮件)

TcpClient  允许创建和使用TCP连接

TcpListener  允许侦听引入的TCP连接请求

UdpClient  用于为UDP客户创建连接(UDP是TCP的一种替代协议,但它没有得到广泛的使用,主要用于本地网络)

 

SmtpClient对象可以通过SMTP传送邮件消息

SmtpClient sc = new SmtpClient("mail.mySmtpHost.com");
sc.Host = "mail.mySmtpHost.com";
MailMessage mm = new MailMessage();
mm.Sender = new MailAddress("[email protected]","Bill Evjen");
mm.To.Add(new MailAddress("[email protected]","Paul Reese"));
mm.To.Add(new MailAddress("[email protected]","Wrox Marketing"));
mm.CC.Add(new MailAddress("[email protected]","Barry Pruett"));
mm.Subject = "The latest chapter";
mm.Body = "<b>Here you can put a long message</b>";
mm.IsBodyHtml = true;
mm.Priority = MailPriority.High;
Attachment att = new Attachment("myExcelResults.zip",MediaTypeNames.Application.Zip);
mm.Attachments.Add(att);
sc.Send(mm);

 

传输控制协议(TCP)类为连接和发送两个端点之间的数据提供了简单的方法

端点是IP地址和端口号的组合

TcpListener类用Start()方法侦听引入的TCP连接

当连接请求到达时,可以使用AcceptSocket()方法返回一个套接字,以与远程计算机通信

或使用AcceptTcpClient()方法通过高层TcpClient对象进行通信

private void btnSend_Click(object sender,System.EventArgs e)
{
    TcpClient tcpClient = new TcpClient(txtHost.Text,Int32.Parse(txtPort.Text));
    NetworkStream ns = tcpClient.GetStream();
    FileStream fs = File.Open("form1.cs",FileMode.Open);

    int data = fs.ReadByte();

    While(data != -1)
    {    
        ns.WriteByte((byte)data);
        data = fs.ReadByte();
    }

    fs.Close();
    ns.Close();
    tcpClient.Close();
}

//添加后台线程 public Form1() { InitializeComponent(); Thread thread = new Thread(new ThreadStart(Listen)); thread.Start(); } public void Listen() { IPAddress localAddr = IPAddress.Parse("127.0.0.1"); Int32 port = 2112; TcpListener tcpListener = new TcpListener(localAddr,port); tcpListener.Start(); TcpClient tcpClient = tcpListener.AcceptTcpClient(); NetworkStream ns = tcpClient.GetStream(); StreamReader sr = new StreamReader(ns); string result = sr.ReadToEnd(); Invoke(new UpdateDisplayDelegate(UpdateDisplay),new object[]{result}); tcpClient.Close(); tcpListener.Stop(); }

 

UdpClient类  成员函数Send()把一个字节数组作为参数,Receive()函数则返回一个字节数组

UDP是一个无连接的协议,可以指定把通信的端点作为Send()方法和Receive()方法的一个参数

UdpClient udpClient = new UdpClient();
string sendMsg = "Hello Echo Server";
byte[] sendBytes = Encoding.ASCII.GetBytes(sendMsg);
udpClient.Send(sendBytes,sendBytes.Length,"SomeEchoServer.net",7);
IPEndPoint endPoint = new IPEndPoint(0,0);
byte[] rcvBytes = udpClient.Receive(ref endPoint);
string rcvMessage = Encoding.ASCII.GetString(rcvBytes,0,rcvBytes.Length);
//should print out "Hello Echo Server"
Console.WriteLine(rcvMessage);

 

UdpClient类和TcpClient类在最底层的Socket类上提供了一个抽象层

Socket类提供了网络编程中最高级的控制

用Socket类重写TcpReceive应用程序

public void Listen()
{
    Socket listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    listener.Bind(new IPEndPoint(IPAddress.Any,2112));
    listener.Listen(0);
    
    Socket socket = listener.Accept();
    Stream netStream = new NetworkStream(socket);
    StreamReader reader = new StreamReader(netStream);

    string result = reader.ReadToEnd();
    Invoke(new UpdateDisplayDelegate(UpdateDisplay)
        new object[] {result});
    socket.Close();
    listener.Close();
}

 

下面介绍一个使用套接字的例子

1.构建服务器控制台应用程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SocketService
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Starting:Creating Socket object");
            Socket listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            listener.Bind(new IPEndPoint(IPAddress.Any,2112));
            listener.Listen(10);

            while (true)
            {
                Console.WriteLine("Waiting for connection on port 2112");
                Socket socket = listener.Accept();
                string receivedValue = string.Empty;

                while (true)
                {
                    byte[] receivedBytes = new byte[1024];
                    int numBytes = socket.Receive(receivedBytes);
                    Console.WriteLine("Receiving.");
                    receivedValue += Encoding.ASCII.GetString(receivedBytes,0,numBytes);
                    if (receivedValue.IndexOf("[FINAL]") > -1)
                    {
                        break;
                    }
                }

                Console.WriteLine("Received value:{0}",receivedValue);
                string replyValue = "Message successfully received.";
                byte[] replyMessage = Encoding.ASCII.GetBytes(replyValue);
                socket.Send(replyMessage);
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }

            listener.Close();
        }
    }
}

2.构建客户端应用程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SocketClient
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] receivedBytes = new byte[1024];
            IPHostEntry ipHost = Dns.Resolve("127.0.0.1");
            IPAddress ipAddress = ipHost.AddressList[0];
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress,2112);
            Console.WriteLine("Starting:Creating Socket object");

            Socket sender = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            sender.Connect(ipEndPoint);
            Console.WriteLine("Successfully connected to {0}",sender.RemoteEndPoint);

            string sendingMessage = "Hello World Socket Test";
            Console.WriteLine("Creating Message;Hello World Socket Test");

            byte[] forwardMessage = Encoding.ASCII.GetBytes(sendingMessage + "[FINAL]");
            sender.Send(forwardMessage);

            int totalBytesReceived = sender.Receive(receivedBytes);
            Console.WriteLine("Message provided from server: {0}",Encoding.ASCII.GetString(receivedBytes,0,totalBytesReceived));
            
            sender.Shutdown(SocketShutdown.Both);
            sender.Close();
            Console.ReadLine();
        }
    }
}

 

结尾附上HTTP协议详解链接HTTP协议详解(真的很经典)

你可能感兴趣的:(学习笔记)