介绍几种dotnet中常用的网络编程类型及其示例

在这里插入图片描述

前言

网络编程在软件开发中扮演着至关重要的角色。随着互联网技术的快速发展,开发者需要掌握各种网络通信协议和技术,以构建高效、可靠和实时的应用程序。无论是实现客户端与服务器之间的通信,还是创建实时互动的Web应用程序,.NET平台都提供了丰富的工具和库来满足这些需求。本文将介绍几种常见的网络编程类型及其实现示例,包括 HTTP 请求与响应、TCP和UDP Socket编程、SignalR、WebSockets等。通过这些示例,能够了解不同的网络编程方式及其应用场景,从而为开发工作提供帮助和指导。

1. Socket 编程

Socket 是最基础、最原始的网络编程方式之一,它提供了一组 API 来实现数据传输和通信。使用 Socket 编程时需要手动处理与底层协议和繁琐的细节,但同时也具有灵活性和可定制性。

以下是基于 TCP 协议实现的 Echo Server 示例:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class EchoServer
{
    
    
    public static void Main()
    {
    
    
        try
        {
    
    
            // 创建一个 TCP/IP socket 监听指定端口
            var port = 12345;
            var listener = new TcpListener(IPAddress.Any, port);
            listener.Start();
            Console.WriteLine($"Echo server is listening on port {
      
      port}...");
            while (true)
            {
    
    
                // 等待客户端连接
                using (var client = listener.AcceptTcpClient())
                {
    
    
                    Console.WriteLine($"Client connected from {
      
      client.Client.RemoteEndPoint}");
                    // 获取 client 的 NetworkStream 并读取客户端发送来的数据
                    using (var stream = client.GetStream())
                    {
    
    
                        var buffer = new byte[1024];
                        var bytesRead = stream.Read(buffer, 0, buffer.Length);
                        // 将客户端发送的数据回传
                        var input = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                        var output = $"Echo: {
      
      input}";
                        var data = Encoding.UTF8.GetBytes(output);
                        stream.Write(data, 0, data.Length);
                        Console.WriteLine($"Received {
      
      input}, echoed back to client.");
                    }
                }
            }
        }
        catch (Exception e)
        {
    
    
            Console.WriteLine($"Error: {
      
      e.Message}");
        }
    }
}

2. WebRequest/WebResponse

WebRequest 和 WebResponse 是 .NET 中用于 Web 通信的最基础和原始的 API。它们提供了一个抽象类,用于发送和接收 HTTP 和 HTTPS 等 Web 请求和响应。

以下是使用 WebRequest/WebResponse 发送 GET 请求并读取响应的示例:

using System;
using System.IO;
using System.Net;
public class HttpExample
{
    
    
    public static void Main()
    {
    
    
        try
        {
    
    
            // 创建 GET 请求,并设置请求头
            var url = "https://www.example.com";
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.UserAgent = "Mozilla/5.0";
            // 发送请求并获取响应
            using (var response = (HttpWebResponse)request.GetResponse())
            {
    
    
                Console.WriteLine($"Status code: {
      
      (int)response.StatusCode} {
      
      response.StatusDescription}");
                Console.WriteLine($"Content type: {
      
      response.ContentType}");
                Console.WriteLine($"Content length: {
      
      response.ContentLength}");
                // 读取响应内容
                using (var stream = response.GetResponseStream())
                using (var reader = new StreamReader(stream))
                {
    
    
                    var responseBody = reader.ReadToEnd();
                    Console.WriteLine(responseBody);
                }
            }
        }
        catch (Exception e)
        {
    
    
            Console.WriteLine($"Error: {
      
      e.Message}");
        }
    }
}

3. HttpClient

HttpClient 是 .NET 中更方便和高级的网络编程 API 之一,它支持各种 HTTP 和 HTTPS 请求、响应和通信。使用 HttpClient 可以轻松地实现网络连接池、缓存等特性。

以下是使用 HttpClient 发送 GET 请求并读取响应的示例:

using System;
using System.Net.Http;
using System.Threading.Tasks;
public class HttpExample
{
    
    
    public static async Task Main()
    {
    
    
        try
        {
    
    
            // 创建 HttpClient 实例
            using (var client = new HttpClient())
            {
    
    
                // 发送 GET 请求并获取响应
                var url = "https://www.example.com";
                var response = await client.GetAsync(url);
                Console.WriteLine($"Status code: {
      
      (int)response.StatusCode} {
      
      response.ReasonPhrase}");
                Console.WriteLine($"Content type: {
      
      response.Content.Headers.ContentType.MediaType}");
                Console.WriteLine($"Content length: {
      
      response.Content.Headers.ContentLength}");
                // 读取响应内容
                var responseBody = await response.Content.ReadAsStringAsync();
                Console.WriteLine(responseBody);
            }
        }
        catch (Exception e)
        {
    
    
            Console.WriteLine($"Error: {
      
      e.Message}");
        }
    }
}

4. SignalR 框架

SignalR 是一个开源的 ASP.NET Core 应用程序框架,用于实现实时、双向、即时通信。它基于 WebSockets 协议并提供了类似于 WebSocket 的功能,同时也支持服务器推送事件和长轮询等传输方式,使得客户端能够实时接收到服务器的更新和推送消息。SignalR 在实现 Web 聊天室、在线游戏、实时监控等方面广泛应用。

以下是 SignalR 框架的主要特点:

  • 实时性:无论是使用 WebSockets 还是其他传输方式,SignalR 都能够提供实时、双向的通信,使得客户端和服务器之间能够立即响应对方的行为。
  • 跨平台:SignalR 支持跨平台开发,可以在 Windows、Linux 或者 macOS 等系统上运行。
  • 可扩展性:SignalR 具有良好的可扩展性,在需要进行横向扩展的情况下能够轻松地增加更多的服务器节点。

以下是 SignalR 框架的示例代码:
服务器

using Microsoft.AspNetCore.SignalR;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

public class ChatHub : Hub
{
    
    
    public async Task SendMessage(string user, string message)
    {
    
    
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

public class Startup
{
    
    
    public void ConfigureServices(IServiceCollection services)
    {
    
    
        services.AddSignalR();
    }

    public void Configure(IApplicationBuilder app)
    {
    
    
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
    
    
            endpoints.MapHub<ChatHub>("/chatHub");
        });
    }
}

客户端

<!DOCTYPE html>
<html>
<head>
    <title>SignalR Chat</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft.signalr/3.1.14/signalr.min.js"></script>
</head>
<body>
    <input type="text" id="userInput" placeholder="Name" />
    <input type="text" id="messageInput" placeholder="Message" />
    <button onclick="sendMessage()">Send</button>
    <ul id="messagesList"></ul>

    <script>
        const connection = new signalR.HubConnectionBuilder()
            .withUrl("/chatHub")
            .build();

        connection.on("ReceiveMessage", (user, message) => {
    
    
            const li = document.createElement("li");
            li.textContent = `${
    
    user}: ${
    
    message}`;
            document.getElementById("messagesList").appendChild(li);
        });

        connection.start().catch(err => console.error(err));

        function sendMessage() {
    
    
            const user = document.getElementById("userInput").value;
            const message = document.getElementById("messageInput").value;
            connection.invoke("SendMessage", user, message).catch(err => console.error(err));
        }
    </script>
</body>
</html>

SignalR 服务器用于处理聊天消息,客户端通过 JavaScript 连接并发送/接收消息。

5. gRPC 框架

gRPC 是一个高性能、开源的远程过程调用(RPC)框架,它支持多种语言和平台,并使用 Protocol Buffers 作为数据序列化格式。相对于传统的 RESTful API,gRPC 具有更高的效率、更强的类型检查和更易于扩展等优点,在微服务架构等场景下广泛应用。

以下是 gRPC 框架的主要特点:

  • 高性能:gRPC 基于 Protobuf 等二进制协议,具有比基于 XML 或 JSON 的协议更高的性能。

  • 跨平台:gRPC 支持跨多种编程语言和平台进行开发和部署,包括 C++、C#、Java、Python、Go 等。

  • 易于扩展:gRPC 的接口定义语言(IDL)和自动生成的代码能够方便地进行版本化和演进,同时还具有可靠性、安全性等特点。

以下是 gRPC 框架的示例代码:

// hello.proto
syntax = "proto3";
package hello;
service Greeter
{
    
    
    rpc SayHello (HelloRequest) returns (HelloReply) {
    
     }
}
message HelloRequest
{
    
    
string name = 1;
}
message HelloReply
{
    
    
string message = 1;
}
// Server.cs
public class GreeterService : Greeter.GreeterBase
{
    
    
    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {
    
    
        return Task.FromResult(new HelloReply
        {
    
    
            Message = "Hello " + request.Name
        });
    }
}
// Client.cs
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest {
    
     Name = "World" });
Console.WriteLine(reply.Message);

6. RestSharp 库

RestSharp 是一个开源的 .NET HTTP 客户端库,用于发送和接收 RESTful 风格的 HTTP 请求和响应。它支持自定义请求头、请求参数、请求体以及各种 HTTP 方法等功能,还提供了方便的异步 API。

以下是 RestSharp 库的主要特点:

  • 灵活性:RestSharp 可以灵活地处理任意类型的请求和响应,包括 XML、JSON、URL 编码等格式。

  • 易于使用:RestSharp 的 API 设计清晰、简单,可以轻松地构建 HTTP 请求和处理响应。

  • 可扩展性:RestSharp 支持插件和扩展,可以轻松地定制和修改各种功能。

以下是 RestSharp 库的示例代码:

var client = new RestClient("https://api.example.com");
var request = new RestRequest("/resource/{id}", Method.GET);
request.AddUrlSegment("id", "123");
request.AddParameter("param", "value");
var response = await client.ExecuteAsync(request);
if (response.IsSuccessful)
{
    
    
    var content = response.Content;
    Console.WriteLine(content);
}
else
{
    
    
    Console.WriteLine($"{
      
      response.StatusCode}: {
      
      response.ErrorMessage}");
}

7. WebSockets

WebSocket 是一种用于双向通信的协议,适合需要实时交互的应用。

服务器

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;

public class Startup
{
    
    
    public void ConfigureServices(IServiceCollection services) {
    
     }

    public void Configure(IApplicationBuilder app)
    {
    
    
        app.UseWebSockets();
        app.Run(async context =>
        {
    
    
            if (context.WebSockets.IsWebSocketRequest)
            {
    
    
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
                await Echo(webSocket);
            }
        });
    }

    private async Task Echo(WebSocket webSocket)
    {
    
    
        var buffer = new byte[1024 * 4];
        while (webSocket.State == WebSocketState.Open)
        {
    
    
            var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
        }
    }
}

客户端

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Chat</title>
</head>
<body>
    <input type="text" id="messageInput" placeholder="Message" />
    <button onclick="sendMessage()">Send</button>
    <ul id="messagesList"></ul>

    <script>
        const connection = new WebSocket("ws://localhost:5000");

        connection.onmessage = function (event) {
      
      
            const li = document.createElement("li");
            li.textContent = event.data;
            document.getElementById("messagesList").appendChild(li);
        };

        function sendMessage() {
      
      
            const message = document.getElementById("messageInput").value;
            connection.send(message);
        }
    </script>
</body>
</html>

说明:WebSocket 服务器回显客户端发送的消息,客户端通过 WebSocket 连接发送和接收消息。

总结

以上示例展示了 .NET 中几种常用的网络编程类型。每种类型都有其独特的使用场景和优势,可以根据项目需求选择合适的网络编程方式。

猜你喜欢

转载自blog.csdn.net/houbincarson/article/details/143135868