51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 489|回复: 0
打印 上一主题 下一主题

[资料] 分享 .NET 中常用的网络编程类型及案例

[复制链接]
  • TA的每日心情
    擦汗
    昨天 09:00
  • 签到天数: 1025 天

    连续签到: 4 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-5-22 13:33:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    介绍几种 .NET 中常用的网络编程类型及其示例:
      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 支持跨平台开发,可以在 WindowsLinux 或者 macOS 等系统上运行。
      · 可扩展性:SignalR 具有良好的可扩展性,在需要进行横向扩展的情况下能够轻松地增加更多的服务器节点。
      以下是 SignalR 框架的示例代码:
      // Startup.cs
      public void ConfigureServices(IServiceCollection services)
      {
      services.AddSignalR();
      }
      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
      // 启用 SignalR 中间件
      app.UseEndpoints(endpoints =>
      {
      endpoints.MapHub<MyHub>("/myhub");
      });
      }
      // MyHub.cs
      public class MyHub : Hub
      {
      public async Task SendMessage(string user, string message)
      {
      // 服务器向客户端发送消息
      await Clients.All.SendAsync("ReceiveMessage", user, message);
      }
      }
      // index.html
      var connection = new signalR.HubConnectionBuilder()
      .withUrl("/myhub")
      .build();
      connection.on("ReceiveMessage", function (user, message) {
      // 处理从服务器接收到的消息
      });
      connection.start().then(function () {
      // 连接成功,可以开始发送消息
      });


      5、gRPC 框架
      gRPC 是一个高性能、开源的远程过程调用(RPC)框架,它支持多种语言和平台,并使用 Protocol Buffers 作为数据序列化格式。相对于传统的 RESTful API,gRPC 具有更高的效率、更强的类型检查和更易于扩展等优点,在微服务架构等场景下广泛应用。
      以下是 gRPC 框架的主要特点:
      ·高性能:gRPC 基于 Protobuf 等二进制协议,具有比基于 XML 或 JSON 的协议更高的性能。
      · 跨平台:gRPC 支持跨多种编程语言和平台进行开发和部署,包括 C++、C#、JavaPython、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}");
      }



    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-27 23:28 , Processed in 0.069111 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表