上篇文章讲述了C#处理文件系统I/O知识点,本文将介绍C#网络编程知识点。随着信息技术的不断发展,网络编程在.NET开发中变得愈发重要。无论是构建Web应用、实现实时通信,还是处理分布式系统,C#网络编程都是必备的技能。以下是.NET开发者在网络编程中应该掌握的关键知识点。
一、http请求知识点
在C#中进行HTTP请求是.NET开发中常见的任务,使用HttpClient类是一种常用的方式。下面将介绍HttpClient的相关知识点。
1、HttpClient类
HttpClient是用于发送HTTP请求和接收HTTP响应的主要类。创建HttpClient实例是进行HTTP请求的第一步。
using System.Net.Http;
HttpClient client = new HttpClient();
2、基本的GET请求
使用HttpClient发送基本的GET请求,获取远程服务器上的资源。
//未带参数
string url = "https://api.example.com/data";
HttpResponseMessage response = await client.GetAsync(url);
// 在GET请求中传递查询参数,以获取符合特定条件的数据。
string url = "https://api.example.com/data";
string queryString = "?param1=value1¶m2=value2";
HttpResponseMessage response = await client.GetAsync(url + queryString);
3、POST请求
使用HttpClient发送POST请求,通常用于提交数据给服务器。
string url = "https://api.example.com/data";
HttpContent content = new StringContent("{'key':'value'}");
HttpResponseMessage response = await client.PostAsync(url, content);
4、请求头设置
在HTTP请求中设置自定义的请求头,如授权信息、内容类型等。
//下面案例是增加token验证
client.DefaultRequestHeaders.Add("Authorization", "Bearer token");
5、处理响应
经过以上GET和Post请求,可以从HttpResponseMessage中获取响应内容、状态码等信息。
string responseBody = await response.Content.ReadAsStringAsync();
HttpStatusCode statusCode = response.StatusCode;
6、异常处理
可以在请求中处理可能的异常,例如网络错误、超时等,通常使用HttpRequestException抓取。
try
{
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
}
catch (HttpRequestException ex)
{
// 处理异常
}
7、异步请求
使用异步方式发送HTTP请求,以避免阻塞主线程。
await Task.Run(async () =>
{
HttpResponseMessage response = await client.GetAsync(url);
// 处理响应
});
8、使用HttpClientFactory
使用HttpClientFactory进行HttpClient的管理,提高性能和资源利用率,官网推荐方法。
string? httpClientName = builder.Configuration["TodoHttpClientName"];
ArgumentException.ThrowIfNullOrEmpty(httpClientName);
//需要依赖注入后使用
builder.Services.AddHttpClient(
httpClientName,
client =>
{
client.BaseAddress = new Uri("https://api.example.com/data");
client.DefaultRequestHeaders.UserAgent.ParseAdd("dotnet-docs");
});
详情可以查看之前文章:在.NET Core使用 HttpClient 的正确方式
9、取消HTTP请求
使用CancellationToken取消正在进行的HTTP请求。
var cts = new CancellationTokenSource();
HttpResponseMessage response = await client.GetAsync(url, cts.Token);
10、文件上传
通过HTTP请求实现文件上传,设置MultipartFormDataContent来传递文件数据。
using var form = new MultipartFormDataContent();
form.Add(new ByteArrayContent(fileBytes), "file", "filename.txt");
HttpResponseMessage response = await client.PostAsync(uploadUrl, form);
这些知识点涵盖了C#中进行HTTP请求时的基本和进阶技巧。熟练运用这些知识,可以轻松处理各种与网络通信相关的场景,从而构建出稳健、高效的.NET应用。
参考:learn.microsoft.com/zh-cn/dotnet/fundamentals/networking/http/httpclient
二、WebSocket通信知识点
WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层。WebSocket通信在C#中是一种实现实时双向通信的重要技术。以下是关于C# WebSocket通信的一些知识点:
1、ClientWebSocket类
ClientWebSocket是C#中用于实现WebSocket客户端的主要类。通过该类可以建立WebSocket连接并进行通信。
using System.Net.WebSockets;
ClientWebSocket webSocket = new ClientWebSocket();
2、建立WebSocket连接
通过ConnectAsync方法建立与WebSocket服务器的连接。
await webSocket.ConnectAsync(new Uri("wss://example.com"), CancellationToken.None);
3、发送WebSocket消息
使用SendAsync方法向WebSocket服务器发送消息。
byte[] messageBytes = Encoding.UTF8.GetBytes("Hello, 欢迎关注DOTNET开发跳槽,获取面试题!");
await webSocket.SendAsync(new ArraySegment(messageBytes), WebSocketMessageType.Text, true, CancellationToken.None);
4、接收WebSocket消息
使用ReceiveAsync方法从WebSocket服务器接收消息。
byte[] buffer = new byte[1024];
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
5、关闭WebSocket连接
使用CloseAsync方法关闭WebSocket连接。
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
6、WebSocket异常处理
都逃不过异常处理,WebSocket处理可能发生的WebSocketException异常,以保证程序的健壮性。
try
{
// WebSocket 操作...
}
catch (WebSocketException ex)
{
Console.WriteLine($"WebSocket 异常: {ex.Message}");
}
7、WebSocket心跳
通过定期发送心跳消息,保持WebSocket连接的活跃状态。
// 发送心跳消息
await webSocket.SendAsync(new ArraySegment(Encoding.UTF8.GetBytes("ping")), WebSocketMessageType.Text, true, CancellationToken.None);
8、使用WebSocket的高级功能
深入了解WebSocket的高级功能,如分帧传输、消息类型等。下代码处理二进制消息。
// 处理二进制消息
await webSocket.SendAsync(new ArraySegment(binaryData), WebSocketMessageType.Binary, true, CancellationToken.None);
9、WebSocket服务器
C#也可以通过第三方库实现WebSocket服务器,如WebSocketListener。
using WebSocketSharp.Server;
var wssv = new WebSocketServer("ws://127.0.0.1:8080");
wssv.AddWebSocketService("/myWebSocket");
wssv.Start();
10、安全性
使用wss协议(WebSocket over TLS/SSL)确保WebSocket通信的安全性。
await webSocket.ConnectAsync(new Uri("wss://example.com"), CancellationToken.None);
这些知识点涵盖了在C#中进行WebSocket通信的基本和一些进阶技巧。通过熟练掌握这些知识,开发者可以实现实时、双向的通信,适用于诸如即时聊天、实时数据推送等场景。
参考:learn.microsoft.com/zh-cn/dotnet/fundamentals/networking/websockets
三、 Socket知识点
Socket又称套接字,套接字是一种软件接口,允许应用程序通过网络与另一个应用程序进行通信。套接字位于操作系统的网络堆栈中,为应用程序提供了与底层网络协议(例如 TCP/IP 和 UDP)交互的能力。Socket是C#中用于网络编程的核心类,它提供了对TCP、UDP等协议的支持。以下是关于C# Socket编程的一些知识点:
1、Socket基础
Socket类是C#中进行网络编程的基础类,用于实现不同协议的通信。
//新建
using System.Net.Sockets;
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2、TCP通信
TCP 通信是通过建立连接来完成的。连接建立后,发送方和接收方可以相互发送数据。TCP 协议通过三次握手来建立连接,通过四次挥手来断开连接。Socket类可以用于实现TCP通信,建立可靠的、面向连接的通信。
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8080));
serverSocket.Listen(10);
Socket clientSocket = serverSocket.Accept();
3、UDP通信
UDP 通信是通过直接发送数据包来完成的。发送方将数据包发送到网络,接收方从网络中接收数据包。UDP 协议不需要建立连接,因此具有更高的效率。通过Socket类实现UDP通信,适用于快速而简单的通信场景。
Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpSocket.Bind(new IPEndPoint(IPAddress.Any, 8080));
4、异步Socket编程
利用SocketAsyncEventArgs实现异步Socket操作,提高程序性能和并发处理能力。
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.Completed += OnSocketCompleted;
socket.ConnectAsync(args);
5、Socket异常处理
处理可能发生的SocketException异常,确保程序的稳定性。
try
{
// Socket 操作...
}
catch (SocketException ex)
{
Console.WriteLine($"Socket 异常: {ex.Message}");
}
6、Socket关闭
在Socket使用完毕后,及时关闭连接,释放资源。
socket.Shutdown(SocketShutdown.Both);
socket.Close();
7、IP地址和端口处理
使用IPAddress和IPEndPoint操作IP地址和端口信息,方便网络连接的建立。
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint endPoint = new IPEndPoint(ipAddress, 8080);
8、网络流操作
NetworkStream用于在Socket上进行读写操作,通过Read和Write方法进行数据交互。
NetworkStream networkStream = new NetworkStream(socket);
byte[] buffer = new byte[1024];
int bytesRead = networkStream.Read(buffer, 0, buffer.Length);
9、Socket性能优化
使用缓冲区、连接池等技术优化Socket性能,提高数据传输效率。
byte[] buffer = new byte[1024];
socket.Receive(buffer);
10、广播和多播
广播和多播都是网络通信中常见的技术。它们的主要区别在于广播是将数据包发送到网络中的所有主机,而多播是将数据包发送到网络中的一组主机。Socket支持实现广播和多播机制,支持向多个目标发送消息。
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
这些知识点涵盖了在C#中进行Socket编程的基本和一些进阶技巧。通过熟练掌握这些知识,可以构建出高效、可靠的网络应用。
参考:learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.-ctor?view=net-8.0
四、c#网络安全知识点
网络安全在网络编程开发中至关重要,在C#开发中也需要注意网络安全,特别是涉及到敏感信息传输或用户身份验证的应用。以下是一些与C#网络安全相关的知识点,以下某些知识点同样适用于其它开发语言:
1、SSL/TLS加密
使用SSL/TLS协议对网络通信进行加密,确保数据在传输过程中不被窃取。在HttpClient中使用HttpClientHandler配置。
HttpClientHandler handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
HttpClient client = new HttpClient(handler);
2、HTTPS通信
可以通过使用HTTPS协议,保护数据的安全传输。使用`https://`的URL而非`http://`。
string url = "https://api.example.com";
HttpResponseMessage response = await client.GetAsync(url);
3、安全的密码存储
使用安全的方式存储和处理用户密码,如使用哈希函数和盐值来加密密码。
string password = "user_password";
string hashedPassword = HashFunction.ComputeHash(password, salt);
4、防止SQL注入
使用参数化查询或ORM工具等,防止SQL注入攻击。
string query = "SELECT * FROM Users WHERE Username = @username";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@username", inputUsername);
5、防止跨站脚本攻击(XSS)
对用户输入进行合适的编码和验证,防止恶意脚本注入。
string userContent = "";
string encodedContent = HttpUtility.HtmlEncode(userContent);
6、 防止跨站请求伪造(CSRF)
ASP.NET MVC可以使用Anti-Forgery Token等机制来防止CSRF攻击。
@Html.AntiForgeryToken()
7、身份验证和授权
使用更高级的身份验证机制,如JWT(JSON Web Token),并在应用中实施合适的授权策略。
[Authorize]
public ActionResult SecureAction()
{
// 安全操作
}
8、安全的文件上传
对用户上传的文件进行验证和安全处理,防止恶意文件上传。
if (IsFileSafe(file))
{
// 处理上传文件
}
9、安全的Cookie处理
对Cookie进行安全设置,如设置HttpOnly、Secure等属性。
var cookie = new HttpCookie("myCookie", "value");
cookie.HttpOnly = true;
cookie.Secure = true;
Response.Cookies.Add(cookie);
五、结语
掌握这些C#网络编程知识点对于.NET开发者来说是至关重要的。这些知识点涵盖了.NET开发中常用的C#网络编程技能,帮助开发者构建出更加健壮和高效的网络应用。在实际项目中,根据需求深入学习和实践这些知识点,将有助于提升.NET开发者在网络编程领域的能力。网络编程还有很多知识点,比如传输格式、RESTful架构风格等,由于篇幅有限就不列出了。
希望本文提供的C#网络编程知识点对每个.NET开发者都有所帮助,对于C#网络编程知识点你还知道哪些?欢迎留言讨论或者吐槽本文。
**参考:**AI查询
推荐阅读
1、每个.NET开发都应掌握的C#多线程知识点
2、每个.NET开发都应掌握的C#特性(Attribute)知识点
3、每个.NET开发都应掌握的C#反射知识点
4、每个.NET开发都应掌握的C#异常处理知识点
5、每个.NET开发都应掌握的C#集合知识点
6、每个.NET开发都应掌握的C#委托事件知识点
7、每个.NET开发都应掌握的C#接口知识点
8、每个.NET开发都应掌握的linq知识点
9、每个.NET开发都应掌握C#泛型的几个知识点
10、每个.NET开发都应掌握的C#处理文件系统I/O知识点
11、每个.NET开发都应该知道的10个.NET库
来源公众号:DotNet开发跳槽