找回密码
 立即注册
查看: 363|回复: 0

[其它] 运用自定义协议设计与实现“跨网络计算器”

[复制链接]

279

主题

0

回帖

964

积分

超级版主

积分
964
发表于 2024-6-19 12:26:45 | 显示全部楼层 |阅读模式
本帖最后由 Shaw0xyz 于 2024-6-20 13:46 编辑

1. 引言

在网络编程中,自定义协议可以用来实现特定的功能和需求。本文将介绍如何运用自定义协议设计和实现一个“跨网络计算器”,使得客户端可以通过网络向服务器发送计算请求,并接收结果。我们将从协议设计、服务器实现、客户端实现三个方面详细讲解,最终实现一个可以在局域网内进行简单加减乘除运算的计算器。

2. 协议设计

2.1 协议概述

我们设计的协议将包括请求和响应两个部分。客户端发送计算请求,服务器处理请求并返回结果。

2.2 请求格式

请求格式由操作符和操作数组成。每个请求包含一个操作符(+、-、*、/)和两个操作数,中间以空格分隔。例如:

  1. + 4 2
复制代码


2.3 响应格式

响应格式为计算结果的字符串表示。例如,对于上述请求,响应可以是:

  1. 6
复制代码


3. 服务器实现

服务器需要能够接收客户端的连接请求,解析计算请求,执行相应的计算,并返回结果。

3.1 创建TCP服务器

首先,我们创建一个TCP服务器来监听客户端的连接请求。

示例:

  1. int port = 5000;
  2. TcpListener listener = new TcpListener(IPAddress.Any, port);
  3. listener.Start();
  4. Console.WriteLine("Server started on port " + port);
复制代码


3.2 接受并处理客户端连接

服务器接受客户端连接后,读取请求,解析并执行计算,然后返回结果。

示例:

  1. while (true) {
  2.     TcpClient client = listener.AcceptTcpClient();
  3.     Thread clientThread = new Thread(() => HandleClient(client));
  4.     clientThread.Start();
  5. }

  6. void HandleClient(TcpClient client) {
  7.     NetworkStream stream = client.GetStream();
  8.     byte[] buffer = new byte[1024];
  9.     int bytesRead;

  10.     try {
  11.         bytesRead = stream.Read(buffer, 0, buffer.Length);
  12.         string request = Encoding.ASCII.GetString(buffer, 0, bytesRead);
  13.         string response = ProcessRequest(request);
  14.         byte[] responseBytes = Encoding.ASCII.GetBytes(response);
  15.         stream.Write(responseBytes, 0, responseBytes.Length);
  16.     } catch (Exception e) {
  17.         Console.WriteLine("Error: " + e.Message);
  18.     } finally {
  19.         client.Close();
  20.     }
  21. }
复制代码


3.3 处理请求

服务器需要解析请求并执行相应的计算。

示例:

  1. string ProcessRequest(string request) {
  2.     string[] parts = request.Split(' ');
  3.     if (parts.Length != 3) {
  4.         return "Error: Invalid request format";
  5.     }

  6.     string operation = parts[0];
  7.     if (!double.TryParse(parts[1], out double operand1) || !double.TryParse(parts[2], out double operand2)) {
  8.         return "Error: Invalid operands";
  9.     }

  10.     double result;
  11.     switch (operation) {
  12.         case "+":
  13.             result = operand1 + operand2;
  14.             break;
  15.         case "-":
  16.             result = operand1 - operand2;
  17.             break;
  18.         case "*":
  19.             result = operand1 * operand2;
  20.             break;
  21.         case "/":
  22.             if (operand2 == 0) return "Error: Division by zero";
  23.             result = operand1 / operand2;
  24.             break;
  25.         default:
  26.             return "Error: Invalid operation";
  27.     }

  28.     return result.ToString();
  29. }
复制代码


4. 客户端实现

客户端需要能够连接到服务器,发送计算请求,并接收和显示结果。

4.1 创建TCP客户端

客户端连接到服务器并发送计算请求。

示例:

  1. string server = "127.0.0.1";
  2. int port = 5000;
  3. TcpClient client = new TcpClient(server, port);
复制代码


4.2 发送请求

客户端发送计算请求并接收响应。

示例:

  1. NetworkStream stream = client.GetStream();
  2. byte[] requestBytes = Encoding.ASCII.GetBytes("+ 4 2");
  3. stream.Write(requestBytes, 0, requestBytes.Length);

  4. byte[] responseBytes = new byte[1024];
  5. int bytesRead = stream.Read(responseBytes, 0, responseBytes.Length);
  6. string response = Encoding.ASCII.GetString(responseBytes, 0, bytesRead);

  7. Console.WriteLine("Response: " + response);

  8. client.Close();
复制代码


5. 完整示例

以下是服务器和客户端的完整示例代码。

5.1 服务器代码

  1. using System;
  2. using System.net;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. using System.Threading;

  6. class Server {
  7.     static void Main() {
  8.         int port = 5000;
  9.         TcpListener listener = new TcpListener(IPAddress.Any, port);
  10.         listener.Start();
  11.         Console.WriteLine("Server started on port " + port);

  12.         while (true) {
  13.             TcpClient client = listener.AcceptTcpClient();
  14.             Thread clientThread = new Thread(() => HandleClient(client));
  15.             clientThread.Start();
  16.         }
  17.     }

  18.     static void HandleClient(TcpClient client) {
  19.         NetworkStream stream = client.GetStream();
  20.         byte[] buffer = new byte[1024];
  21.         int bytesRead;

  22.         try {
  23.             bytesRead = stream.Read(buffer, 0, buffer.Length);
  24.             string request = Encoding.ASCII.GetString(buffer, 0, bytesRead);
  25.             string response = ProcessRequest(request);
  26.             byte[] responseBytes = Encoding.ASCII.GetBytes(response);
  27.             stream.Write(responseBytes, 0, responseBytes.Length);
  28.         } catch (Exception e) {
  29.             Console.WriteLine("Error: " + e.Message);
  30.         } finally {
  31.             client.Close();
  32.         }
  33.     }

  34.     static string ProcessRequest(string request) {
  35.         string[] parts = request.Split(' ');
  36.         if (parts.Length != 3) {
  37.             return "Error: Invalid request format";
  38.         }

  39.         string operation = parts[0];
  40.         if (!double.TryParse(parts[1], out double operand1) || !double.TryParse(parts[2], out double operand2)) {
  41.             return "Error: Invalid operands";
  42.         }

  43.         double result;
  44.         switch (operation) {
  45.             case "+":
  46.                 result = operand1 + operand2;
  47.                 break;
  48.             case "-":
  49.                 result = operand1 - operand2;
  50.                 break;
  51.             case "*":
  52.                 result = operand1 * operand2;
  53.                 break;
  54.             case "/":
  55.                 if (operand2 == 0) return "Error: Division by zero";
  56.                 result = operand1 / operand2;
  57.                 break;
  58.             default:
  59.                 return "Error: Invalid operation";
  60.         }

  61.         return result.ToString();
  62.     }
  63. }
复制代码


5.2 客户端代码

  1. using System;
  2. using System.Net.Sockets;
  3. using System.Text;

  4. class Client {
  5.     static void Main() {
  6.         string server = "127.0.0.1";
  7.         int port = 5000;
  8.         TcpClient client = new TcpClient(server, port);

  9.         NetworkStream stream = client.GetStream();
  10.         byte[] requestBytes = Encoding.ASCII.GetBytes("+ 4 2");
  11.         stream.Write(requestBytes, 0, requestBytes.Length);

  12.         byte[] responseBytes = new byte[1024];
  13.         int bytesRead = stream.Read(responseBytes, 0, responseBytes.Length);
  14.         string response = Encoding.ASCII.GetString(responseBytes, 0, bytesRead);

  15.         Console.WriteLine("Response: " + response);

  16.         client.Close();
  17.     }
  18. }
复制代码


6. 结论

本文介绍了如何设计和实现一个“跨网络计算器”。通过定义简单的请求和响应协议,使用C#实现了能够处理并发连接的TCP服务器,并展示了如何实现客户端与服务器之间的通信。希望本文能帮助开发者理解和掌握自定义协议的设计与实现,为实现更复杂的网络应用奠定基础。





/ 荔枝学姐de课后专栏 /

Hi!这里是荔枝学姐~

欢迎来到我的课后专栏

自然语言学渣 NLP摆烂姐

热衷于技术写作 IT边角料

AIGC & Coding & linux ...

~互撩~ TG: @Shaw_0xyz
荔枝学姐爱吃荔枝!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 23:12 , Processed in 0.070390 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

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