每个.NET开发都应掌握的C#网络编程知识点

上篇文章讲述了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&param2=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<byte>(messageBytes), WebSocketMessageType.Text, true, CancellationToken.None);

4、接收WebSocket消息

使用ReceiveAsync方法从WebSocket服务器接收消息。

   byte[] buffer = new byte[1024];
   WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(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<byte>(Encoding.UTF8.GetBytes("ping")), WebSocketMessageType.Text, true, CancellationToken.None);

8、使用WebSocket的高级功能

深入了解WebSocket的高级功能,如分帧传输、消息类型等。下代码处理二进制消息。

   // 处理二进制消息
   await webSocket.SendAsync(new ArraySegment<byte>(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<MyWebSocketBehavior>("/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 = "<script>alert('XSS');</script>";
   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开发跳槽    
posted @ 2023-12-18 12:22  翔星  阅读(804)  评论(0编辑  收藏  举报