码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2014-11-19 12:35:54      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   使用   sp   

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("evjen@yahoo.com","Bill Evjen");
mm.To.Add(new MailAddress("editor@wrox.com","Paul Reese"));
mm.To.Add(new MailAddress("marketing@wrox.com","Wrox Marketing"));
mm.CC.Add(new MailAddress("publisher@wrox.com","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();
}

 

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

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

标签:style   blog   http   io   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/bmbh/p/4107871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!