51Testing软件测试论坛

标题: 分享 .NET 中常用的网络编程类型及案例 [打印本页]

作者: lsekfe    时间: 2023-5-22 13:33
标题: 分享 .NET 中常用的网络编程类型及案例
介绍几种 .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}");
  }








欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2