C#之网络
首先很不好意思,前段时间把评论的功能给关掉啦,BUT NOW 此功能以开放,欢迎小伙伴们拍砖。
1网络
在网络环境下,我们最感兴趣的两个名称空间是System.Net和System.Net.Sockets. System.Net名称空间通常与交高价的操作有关,例如 上传和下载 使用Http和其他协议进行Web请求等,而System.Net.Sockets名 称空间包含的类通常与较低层的操作有关.如果要直接使用套接字或 TCP/P之 类 的协议,这 个名 称空间 中 的类就非 常有用 .
2WebClient类
如 果只想从特定的URl请求文件,则可以使用的最简单的.Net类是System.Net.WebClient
2.1下载文件
DEMO:
1 WebClient client = new WebClient();
2 Stream stream = client.OpenRead("http://www.baidu.com");
3 StreamReader reader = new StreamReader(stream);
4 string line = null;
5 while ((line = reader.ReadLine()) != null)
6 {
7 Console.WriteLine(line);
8 }
9 reader.Close();
10 stream.Close();
11 Console.ReadLine();
2.2文件上传
WebClient类还提供了UploadFile()和UploadData()方法。尽管这个类使用起来比较方便,但是它的功能非常有限,特别是不能使用它提供身份验证。
3WebRequest类和WebResponse类
WebRequet类代表要给某个特定的URL发送信息的请求,URL作为参数传递给Create()方法。WebResponse类代表从服务器检索数据,调用WebRequest.GetResponse()方法,实际上是把请求发给Web服务器,并创建一个Response对象,以检查返回数据。
1 WebRequest wrq = WebRequest.Create("http://www.ithome.com/");
2 WebResponse wrs = wrq.GetResponse();
3 Stream stream = wrs.GetResponseStream();
4 StreamReader reader = new StreamReader(stream);
5 string line;
6 while ((line = reader.ReadLine()) != null)
7 {
8 Console.WriteLine(line);
9 }
10 stream.Close();
11 Console.ReadLine();
3.1身份验证
WebRequest类中的另一个属性是Credentials属性。如果需要身份验证证书附带在请求中,就可以用用户名和密码创建NetworkCredential类的一个实例,在调用GetResponse()方法之前。
1 NetworkCredential nc = new NetworkCredential("username","password");
2 wrq.Credentials = nc;
3.2使用代理
许多公司都需要使用代理服务器进行所有类型的Http或FTP请 求。 代理服务器常常使用 某种形式的安全性(通 常是用户名和密码),路 由公司 的所有请求和响应 。 对于使用 WebClient对象或WebRequest对象的应用程序,需 要考虑这些代理服务器,同上,在调用之前需要使用WebProxy对象
1 WebProxy wp = new WebProxy("192.168.1.100",true);
2 wp.Credentials= new NetworkCredential("username", "password");
3 WebRequest wrq = WebRequest.Create("http://www.ithome.com/");
4 wrq.Proxy = wp;
5 WebResponse wrs = wrq.GetResponse();
如果除了证书之外,还需要设计用户的域,就应在NetworkCredential实例上使用另外一个签名
1 WebProxy wp = new WebProxy("192.168.1.100",true);
2 wp.Credentials= new NetworkCredential("username", "password","domain");
3 WebRequest wrq = WebRequest.Create("http://www.ithome.com/");
4 wrq.Proxy = wp;
5 WebResponse wrs = wrq.GetResponse();
4把输出的结果显示为HTML页面
1 Process myproess = new Process(); 2 myproess.StartInfo.FileName = "iexplore.exe"; 3 myproess.StartInfo.Arguments = "http://www.ithome.com/"; 4 myproess.Start();
上面的代码会把IE作为单独的窗口打开,而应用程序并没有与新窗口相连,因此不能控制浏览器。
4.1从应用程序进行简单的web浏览
如果想在应用程序打开网页就可以使用WebBrowser控件。
5实用工具类
5.1URL
Url和 UrlBulider是System (注意:不是 system.Net)名称空间 中的两个类 ,它们都用 于表示 URI。UriBuilder类允许把给定的字符串当作URL的组成部分,从而构建一个URL。
Uri url = new Uri("http://www.ithome.com");
5.2 IP地址和DNS名称
用于IP地址的.NET类IPAdress类和IPHostEntry
6较底层的协议
- Socket 这个底层的类用于管理连接,WebRequest ,TcpClient等类在内部使用这个类
- NetworkStream 这个类从Stream派生的,它表示来自网络的数据流。
- SmtpClient 允许通过SMTP发送消息(邮件)
- TcpClient 允许创建和使用TCP连接
- TcpListener 允许侦听引入的TCP连接请求
- UdpClient 用于为UDP客户创建(UDP是TCP的一种替代协议,但它主要用于本地网络)
6.1使用SmtpClient
SmtpClient 对象可以通过SMTP传送邮件消息,
MailMessage myMail = new MailMessage(); //发送端到接收端的邮箱地址
myMail = new MailMessage("发送人@163.com", "收件人@qq.com");
myMail.Subject = "1";
//建立发送对象client,验证邮件服务器,服务器端口,用户名,以及密码
SmtpClient client = new SmtpClient("123.125.50.133", 25);
client.Credentials = new NetworkCredential("用户名", "密码");
client.Send(myMail);
但是有一个问题,这个方法再发送多余10条邮件的时候会报错,下面附上可发多条的方法
SendEmail6.2使用TCP类
传输控制协议(TCP)类为连接和发送两个端点之间的数据提供了简单的方法。端点是IP地址和端口号的组合。TcpClient类封装了TCP连接,提供了许多属性来控制连接,包括缓冲,缓冲区的大小和超时,通过GetStream()方法请求NetworkStream对象是可以附带读写功能。
TcpListener类用start()方法侦听引入的TCP连接,当连接请求到达时,可使用AcceptSocket()方法返回一个套接字,以与远程的计算机通信,或使用AcceptTcpClient()方法通过高层的TcpClient对象进行通讯。
6.3TCP和UDP
UDP是一个几乎没有什么功能的简单协议 ,且几乎没有什么系统开销。 开发人员常常在速度和性能要求比可靠性更高的应用程序中使用 UDP,例如,视频流。 相反,TCP提 供了许多功能来确保数据的传输,它还提供 了错误校正,和 当数据丢失或数据包损坏时重新传输它们 的功能。 最后,TCP可 缓存传入和传出的数据,还保证在传输过程中,在把数据包传送给应用程序之前,重 组杂乱的一系列数据包。 即使有一些额外的开销,TCP仍是在 internet 上使用最广泛的协议,因 为它有非常高的可靠性 。
6.4UDP类
1 UdpClient udpclient = new UdpClient(); 2 string sendMsg = "Hello"; 3 byte[] sendBytes = Encoding.ASCII.GetBytes(sendMsg); 4 udpclient.Send(sendBytes,sendBytes.Length,"SomEchoServer.net",7); 5 IPEndPoint endPoint = new IPEndPoint(0,0); 6 byte[] rcvBytes = udpclient.Receive(ref endPoint); 7 string rcvmessage = Encoding.ASCII.GetString(rcvBytes,0,rcvBytes.Length);
6.5TcpSend和TcpReceive示例
TcpSend端代码:
1 TcpClient tcpClient = new TcpClient(主机,端口号);
2 NetworkStream ns = tcpClient.GetStream();
3 FileStream fs = File.Open("Form1.cs",FileMode.Open);
4
5 int data = fs.ReadByte();
6
7 while (data != -1)
8 {
9 ns.WriteByte((byte)data);
10 data = fs.ReadByte();
11 }
12 fs.Close();
13 ns.Close();
14 tcpClient.Close();
TcpReceive端:
1 Thread theard = new Thread(new ThreadStart(Listen)); //winfrom程序,只有一个textBox为txtDisplay
2 theard.Start();//为避免界面假死,放到线程中
3
4
5 public void Listen()
6 {
7 IPAddress localAddr = IPAddress.Parse("127.0.0.1");//本机
8 int port = 2112;//端口号要与tcpSend端一致
9 TcpListener tcpListenter = new TcpListener(localAddr, port);
10 tcpListenter.Start();
11
12 TcpClient tcpClient = tcpListenter.AcceptTcpClient();
13 NetworkStream ns = tcpClient.GetStream();
14 StreamReader sr = new StreamReader(ns);
15 string result = sr.ReadToEnd();
16 Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] { result });
17 tcpClient.Close();
18 tcpListenter.Stop();
19 }
20
21 public void UpdateDisplay(string text)
22 {
23 txtDisplay.Text = text;
24 }
25 }
26 public delegate void UpdateDisplayDelegate(string text);
6.5 Socket类
Socket类提供了网络编程中最高级的控制。
构建服务器控制台应用程序:
View Code客户端代码:
View Code6.6Websocket
Websocket协议用于完全双工的通信,一般在浏览器和服务器之间通信。
客户端
服务端

浙公网安备 33010602011771号