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:
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);
}
}
}
服务端
C#之网络的更多相关文章
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法
如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...
- Virtual Box配置CentOS7网络(图文教程)
之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...
- 前端网络、JavaScript优化以及开发小技巧
一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- C# 利用性能计数器监控网络状态
本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态.并能够直观的展现出来 涉及到的知识点: PerformanceCounter,表示 Windows NT 性能计数器 ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化
KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...
- [原] KVM虚拟机网络闪断分析
背景 公司云平台的机器时常会发生网络闪断,通常在10s-100s之间. 异常情况 VM出现问题时,表现出来的情况是外部监控系统无法访问,猜测可能是由于系统假死,OVS链路问题等等.但是在出现网络问题的 ...
随机推荐
- Android 最火高速开发框架AndroidAnnotations使用具体解释
Android 最火的高速开发框架androidannotations配置具体解释文章中有eclipse配置步骤,Android 最火高速开发框架AndroidAnnotations简介文章中的简介, ...
- 点击轮播图片左右button,实现轮播效果
点击左右button.实现图片轮播效果.js代码例如以下: $(function () { var index = 1; var pPage = 1; var $v_citemss = $(" ...
- Effective C++_笔记_条款02_尽量以const、enum、inline替换#define
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许#d ...
- POJ 1781 In Danger Joseph环 位运算解法
Joseph环,这次模固定是2.假设不是固定模2,那么一般时间效率是O(n).可是这次由于固定模2,那么能够利用2的特殊性,把时间效率提高到O(1). 规律能够看下图: watermark/2/tex ...
- IT忍者神龟之中的一个句sql语句——连接同一字段的全部值
Oracle能够用SYS_CONNECT_BY_PATH字符串聚合函数: SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(productname, ', ')), ', ') ...
- HDU 4876 ZCC loves cards _(:зゝ∠)_ 随机输出保平安
GG,,,g艹 #include <cstdio> #include <iostream> #include <algorithm> #include <st ...
- 【OpenMesh】Some basic operations: Flipping and collapsing edges
这一节中你将学到一些OpenMesh中早已提供的基础操作. 内容包括三角形网格边的翻转以及通过连接邻接的顶点边缘折叠. 三角形网格的翻转(Flipping edges) 考虑到两个邻接面的三角形网格中 ...
- zoj 1107 FatMouse and Cheese(记忆化搜索)
题目链接:点击链接 题目大意:老鼠从(0,0)出发,每次在同一个方向上最多前进k步,且每次到达的位置上的数字都要比上一个位置上的数字大,求老鼠经过的位置上的数字的和的最大值 #include<s ...
- HDOJ 2442 -bricks 状态压缩DP 一直TLE.打表过的..
有5个砖块..加上一个空着不放..那么有6种状态..所以很明显的可以用6进制的状态DP... 不过这么做..我觉得我已经能优化的都优化了...还是超时..一看数据范围是100*6..打表先AC了.. ...
- 积累的VC编程小技巧之标题栏和菜单
1.窗口最大最小化按纽的控制 ①怎样在程序开始的时候让它最大化? ②vc++做出来的exe文件在窗体的右上方是没有最大化和最小化按钮的,怎样实现这一功能? ③如何在显示窗口时,使最大化按钮变灰? ...