首页 技术 正文
技术 2022年11月17日
0 收藏 457 点赞 2,707 浏览 12560 个字

首先很不好意思,前段时间把评论的功能给关掉啦,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:

  WebClient client = new WebClient();             Stream stream = client.OpenRead("http://www.baidu.com");             StreamReader reader = new StreamReader(stream);             string line = null;             while ((line = reader.ReadLine()) != null)             {                 Console.WriteLine(line);             }             reader.Close();             stream.Close();             Console.ReadLine();

2.2文件上传

  WebClient类还提供了UploadFile()和UploadData()方法。尽管这个类使用起来比较方便,但是它的功能非常有限,特别是不能使用它提供身份验证。

3WebRequest类和WebResponse类

  WebRequet类代表要给某个特定的URL发送信息的请求,URL作为参数传递给Create()方法。WebResponse类代表从服务器检索数据,调用WebRequest.GetResponse()方法,实际上是把请求发给Web服务器,并创建一个Response对象,以检查返回数据。

  WebRequest wrq = WebRequest.Create("http://www.ithome.com/");             WebResponse wrs = wrq.GetResponse();             Stream stream = wrs.GetResponseStream();             StreamReader reader = new StreamReader(stream);             string line;             while ((line = reader.ReadLine()) != null)             {                 Console.WriteLine(line);             }             stream.Close();             Console.ReadLine();

3.1身份验证

WebRequest类中的另一个属性是Credentials属性。如果需要身份验证证书附带在请求中,就可以用用户名和密码创建NetworkCredential类的一个实例,在调用GetResponse()方法之前。

   NetworkCredential nc = new NetworkCredential("username","password");             wrq.Credentials = nc;

3.2使用代理

许多公司都需要使用代理服务器进行所有类型的Http或FTP请 求。 代理服务器常常使用 某种形式的安全性(通 常是用户名和密码),路 由公司 的所有请求和响应 。 对于使用 WebClient对象或WebRequest对象的应用程序,需 要考虑这些代理服务器,同上,在调用之前需要使用WebProxy对象

 WebProxy wp = new WebProxy("192.168.1.100",true);             wp.Credentials= new NetworkCredential("username", "password");             WebRequest wrq = WebRequest.Create("http://www.ithome.com/");             wrq.Proxy = wp;             WebResponse wrs = wrq.GetResponse();
如果除了证书之外,还需要设计用户的域,就应在NetworkCredential实例上使用另外一个签名
  WebProxy wp = new WebProxy("192.168.1.100",true);             wp.Credentials= new NetworkCredential("username", "password","domain");             WebRequest wrq = WebRequest.Create("http://www.ithome.com/");             wrq.Proxy = wp;             WebResponse wrs = wrq.GetResponse();

4把输出的结果显示为HTML页面

  Process myproess = new Process();             myproess.StartInfo.FileName = "iexplore.exe";             myproess.StartInfo.Arguments = "http://www.ithome.com/";             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 = ";            //建立发送对象client,验证邮件服务器,服务器端口,用户名,以及密码            SmtpClient client = );            client.Credentials = new NetworkCredential("用户名", "密码");            client.Send(myMail);

但是有一个问题,这个方法再发送多余10条邮件的时候会报错,下面附上可发多条的方法

 public void SendEmail()         {             //smtp.163.com             string senderServerIp = "123.125.50.133";             //smtp.gmail.com             //string senderServerIp = "74.125.127.109";             //smtp.qq.com             //string senderServerIp = "58.251.149.147";             //string senderServerIp = "smtp.sina.com";             string toMailAddress = "";//收件邮箱             string fromMailAddress = "";             ";//邮件标题             string bodyInfo = "";//邮件内容             string mailUsername = "";//发送邮箱的用户名(不带@qq.com)             string mailPassword = ""; //发送邮箱的密码()             ";             //  string attachPath = "E:\\123123.txt; E:\\haha.pdf";             MyEmail email = new MyEmail(senderServerIp, toMailAddress, fromMailAddress, subjectInfo, bodyInfo, mailUsername, mailPassword, mailPort, false, false);             //  email.AddAttachments(attachPath);             email.Send();             MessageBox.Show("OK!");         }     }     public class MyEmail     {         private MailMessage mMailMessage;   //主要处理发送邮件的内容(如:收发人地址、标题、主体、图片等等)         private SmtpClient mSmtpClient; //主要处理用smtp方式发送此邮件的配置信息(如:邮件服务器、发送端口号、验证方式等等)         private int mSenderPort;   //发送邮件所用的端口号(htmp协议默认为25)         private string mSenderServerHost;    //发件箱的邮件服务器地址(IP形式或字符串形式均可)         private string mSenderPassword;    //发件箱的密码         private string mSenderUsername;   //发件箱的用户名(即@符号前面的字符串,例如:hello@163.com,用户名为:hello)         private bool mEnableSsl;    //是否对邮件内容进行socket层加密传输         private bool mEnablePwdAuthentication;  //是否对发件人邮箱进行密码验证         ///<param name="server">发件箱的邮件服务器地址</param>         ///<param name="toMail">收件人地址(可以是多个收件人,程序中是以“;"进行区分的)</param>         ///<param name="fromMail">发件人地址</param>         ///<param name="subject">邮件标题</param>         ///<param name="emailBody">邮件内容(可以以html格式进行设计)</param>         ///<param name="username">发件箱的用户名(即@符号前面的字符串,例如:hello@163.com,用户名为:hello)</param>         ///<param name="password">发件人邮箱密码</param>         ///<param name="port">发送邮件所用的端口号(htmp协议默认为25)</param>         ///<param name="sslEnable">true表示对邮件内容进行socket层加密传输,false表示不加密</param>         ///<param name="pwdCheckEnable">true表示对发件人邮箱进行密码验证,false表示不对发件人邮箱进行密码验证</param>         public MyEmail(string server, string toMail, string fromMail, string subject, string emailBody, string username, string password, string port, bool sslEnable, bool pwdCheckEnable)         {             try             {                 mMailMessage = new MailMessage();                 mMailMessage.To.Add(toMail);                 mMailMessage.From = new MailAddress(fromMail);                 mMailMessage.Subject = subject;                 mMailMessage.Body = emailBody;                 mMailMessage.IsBodyHtml = true;                 mMailMessage.BodyEncoding = System.Text.Encoding.UTF8;                 mMailMessage.Priority = MailPriority.Normal;                 this.mSenderServerHost = server;                 this.mSenderUsername = username;                 this.mSenderPassword = password;                 this.mSenderPort = Convert.ToInt32(port);                 this.mEnableSsl = sslEnable;                 this.mEnablePwdAuthentication = pwdCheckEnable;             }             catch (Exception ex)             {                 Console.WriteLine(ex.ToString());             }         }         ///<summary>         /// 添加附件         ///</summary>         ///<param name="attachmentsPath">附件的路径集合,以分号分隔</param>         public void AddAttachments(string attachmentsPath)         {             try             {                 string[] path = attachmentsPath.Split(';'); //以什么符号分隔可以自定义                 Attachment data;                 ContentDisposition disposition;                 ; i < path.Length; i++)                 {                     data = new Attachment(path[i], MediaTypeNames.Application.Octet);                     disposition = data.ContentDisposition;                     disposition.CreationDate = File.GetCreationTime(path[i]);                     disposition.ModificationDate = File.GetLastWriteTime(path[i]);                     disposition.ReadDate = File.GetLastAccessTime(path[i]);                     mMailMessage.Attachments.Add(data);                 }             }             catch (Exception ex)             {                 Console.WriteLine(ex.ToString());             }         }         ///<summary>         /// 邮件的发送         ///</summary>         public void Send()         {             try             {                 if (mMailMessage != null)                 {                     mSmtpClient = new SmtpClient();                     mSmtpClient.Host = this.mSenderServerHost;                     mSmtpClient.Port = this.mSenderPort;                     mSmtpClient.UseDefaultCredentials = false;                     mSmtpClient.EnableSsl = this.mEnableSsl;                     if (this.mEnablePwdAuthentication)                     {                         System.Net.NetworkCredential nc = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);                         mSmtpClient.Credentials = nc.GetCredential(mSmtpClient.Host, mSmtpClient.Port, "NTLM");                     }                     else                     {                         mSmtpClient.Credentials = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);                     }                     mSmtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;                     mSmtpClient.Send(mMailMessage);                 }             }             catch (Exception ex)             {                 Console.WriteLine(ex.ToString());             }         }     }

SendEmail

6.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类

   UdpClient udpclient = new UdpClient();             string sendMsg = "Hello";             byte[] sendBytes = Encoding.ASCII.GetBytes(sendMsg);             udpclient.Send(sendBytes,sendBytes.Length,);             IPEndPoint endPoint = ,);             byte[] rcvBytes = udpclient.Receive(ref endPoint);             ,rcvBytes.Length);

6.5TcpSend和TcpReceive示例

TcpSend端代码:
  TcpClient tcpClient = new TcpClient(主机,端口号);              NetworkStream ns = tcpClient.GetStream();              FileStream fs = File.Open("Form1.cs",FileMode.Open);            int data = fs.ReadByte();             )            {                ns.WriteByte((byte)data);                  data = fs.ReadByte();             }              fs.Close();             ns.Close();              tcpClient.Close();
TcpReceive端:
 
  Thread theard = new Thread(new ThreadStart(Listen)); //winfrom程序,只有一个textBox为txtDisplay             theard.Start();//为避免界面假死,放到线程中   public void Listen()          {              IPAddress localAddr = IPAddress.Parse("127.0.0.1");//本机             ;//端口号要与tcpSend端一致             TcpListener tcpListenter = new TcpListener(localAddr, port);              tcpListenter.Start();              TcpClient tcpClient = tcpListenter.AcceptTcpClient();              NetworkStream ns = tcpClient.GetStream();              StreamReader sr = new StreamReader(ns);              string result = sr.ReadToEnd();              Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] { result });              tcpClient.Close();            tcpListenter.Stop();          }          public void UpdateDisplay(string text)         {             txtDisplay.Text = text;         }      }      public delegate void UpdateDisplayDelegate(string text);

6.5 Socket类

  Socket类提供了网络编程中最高级的控制。  构建服务器控制台应用程序:
 Console.WriteLine("Stating:Creating Socket object");             Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);             listener.Bind());             listener.Listen();             while (true)             {                 Console.WriteLine("Wait for content");                 Socket socket = listener.Accept();                 string receiveMsg = string.Empty;                 while (true)                 {                     ];                     int numBytes = socket.Receive(bytes);                     Console.WriteLine("Receiveving...");                     receiveMsg += Encoding.ASCII.GetString(bytes, , numBytes);                     )                     {                         break;                     }                 }                 Console.WriteLine("Receivevalue:{0}",receiveMsg);                 string replyValue = "Message successfully received";                 byte[] replyByte = Encoding.ASCII.GetBytes(replyValue);                 socket.Send(replyByte);                 socket.Shutdown(SocketShutdown.Both);                 socket.Close();             }             listener.Close();         }
客户端代码:
   ];             IPHostEntry ipHost = Dns.Resolve("127.0.0.1");             IPAddress ipAddress = ipHost.AddressList[];             IPEndPoint ipEndPoint = );             Console.WriteLine("Starting : Creating Socket object");             Socket sender = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);             sender.Connect(ipEndPoint);             Console.WriteLine("Successfully contendted to {0}",sender.RemoteEndPoint);             string sendingMessage = "Hello";             Console.WriteLine("Creating message:Hello World");             byte[] forwardMessage = Encoding.ASCII.GetBytes(sendingMessage+"[FINAL]");             sender.Send(forwardMessage);             int totalBytesReceived = sender.Receive(receivedBytes);             Console.WriteLine(,totalBytesReceived));             sender.Shutdown(SocketShutdown.Both);             sender.Close();             Console.ReadKey();
6.6WebsocketWebsocket协议用于完全双工的通信,一般在浏览器和服务器之间通信。
 <!doctype html> <head>     <meta http-equiv="X-UA-Compatible" content="IE=edge" />     <script src="Scripts/jquery-1.7.2.min.js" type="text/javascript"></script>     <title>WroxChat</title>     <script type="text/javascript">         $(document).ready(function () {             var name = prompt('what is your name?:');             var url = 'ws://localhost/ws.ashx?name=' + name;             ws = new WebSocket(url);             ws.onopen = function () {                 $('#messages').prepend('Connected <br/>');                 $('#cmdSend').click(function () {                     ws.send($('#txtMessage').val());                     $('#txtMessage').val('');                 });             };             ws.onmessage = function (e) {                 $('#chatMessages').prepend(e.data + '<br/>');             };             $('#cmdLeave').click(function () {                 ws.close();             });             ws.onclose = function () {                 $('#chatMessages').prepend('Closed <br/>');             };             ws.onerror = function (e) {                 $('#chatMessages').prepend('Oops something went wront <br/>');             };         });     </script> </head> <body> <input id="txtMessage" /> <input id="cmdSend" type="button" value="Send" /> <input id="cmdLeave" type="button" value="Leave" /> <br /> <div id="chatMessages" /> </body>

客户端


  public class ws : IHttpHandler     {         public void ProcessRequest(HttpContext context)         {             if (context.IsWebSocketRequest)             {                 var chatuser = new ChatUser();                 chatuser.UserName = context.Request.QueryString["name"];                 ChatApp.AddUser(chatuser);                 context.AcceptWebSocketRequest(chatuser.HandleWebSocket);             }         }         public bool IsReusable         {             get             {                 return false;             }         }     } public class ChatApp     {         static IList<ChatUser> _users = new List<ChatUser>();         public static void AddUser(ChatUser chatUser)         {             _users.Add(chatUser);             foreach(var user in _users)             {                 user.SendMessage(chatUser.UserName + " joined the chat!");             }         }         public static void BroadcastMessage(string message)         {             foreach (var user in _users)             {                 user.SendMessage(message);             }         }     } public class ChatUser     {         WebSocketContext _context;         public string UserName { get; set; }         public async Task HandleWebSocket(WebSocketContext wsContext)         {             _context = wsContext;             ;             byte[] receiveBuffer = new byte[maxMessageSize];             WebSocket socket = _context.WebSocket;             while (socket.State == WebSocketState.Open)             {                 WebSocketReceiveResult receiveResult = await socket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);                 if (receiveResult.MessageType == WebSocketMessageType.Close)                 {                     await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);                 }                 else if (receiveResult.MessageType == WebSocketMessageType.Binary)                 {                     await socket.CloseAsync(WebSocketCloseStatus.InvalidMessageType, "Cannot accept binary frame", CancellationToken.None);                 }                 else                 {                     , receiveResult.Count);                     var echoString = string.Concat(UserName, " said: ", receivedString);                     ArraySegment<byte> outputBuffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(echoString));                     ChatApp.BroadcastMessage(echoString);                 }             }         }         public async Task SendMessage(string message)         {             if (_context != null && _context.WebSocket.State == WebSocketState.Open)             {                 var outputBuffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(message));                 await _context.WebSocket.SendAsync(outputBuffer, WebSocketMessageType.Text, true, CancellationToken.None);             }         }     }

服务端

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,997
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,511
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,355
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,138
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,770
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,848