Lazy loaded image
C#模拟网络协议发送
Words 2078Read Time 6 min
2024-9-7
2025-3-6
type
status
date
slug
summary
tags
category
icon
password
😀
身为游戏前端,做需求时和后端的对接联调总是很频繁,由此就想弄懂网络协议收发的原理到底是什么,想不如做,在C#中,我们可以用System.Net.Sockets命名空间中的TcpClientTcpListener类来模拟客户端-服务器网络协议的发送、接收和回复。

服务器处理

  • TcpListener用于监听来自客户端的连接请求。
  • AcceptTcpClient()方法接受客户端的连接,并返回一个TcpClient对象。
  • NetworkStream用于与客户端进行数据交换。
  • Read()方法从网络流中读取数据,Write()方法向网络流中写入数据。

客户端处理

  • TcpClient用于连接到指定的服务器。
  • NetworkStream用于与服务器进行数据交换。
  • Write()方法向网络流中写入数据,Read()方法从网络流中读取数据。

🤗 运行步骤

  1. 启动服务器:首先运行服务器端程序。它将开始监听指定端口(如8888),等待客户端连接。
  1. 启动客户端:然后运行客户端程序。它将连接到服务器并发送一条消息。
  1. 查看输出:在控制台中,你将看到服务器和客户端的交互过程。

📎 结论

启动服务器
notion image
启动客户端并发送消息;收到服务器回复
notion image
服务器收到消息并回复
notion image

📎 扩展

异常处理

在现有的TCP服务器代码中还可以添加异常处理机制,用try-catch块来捕获处理可能发生的的网络异常,例如连接失败、超时等
  1. try-catch:将主要的网络操作放在try块中,捕获可能的异常。
  1. SocketException:捕获与套接字相关的异常,如连接失败、超时等。
  1. IOException:捕获与输入输出相关的异常。
  1. Exception:捕获所有其他未预见的异常。
  1. finally:确保无论是否发生异常,服务器监听器都会被正确停止。

多请求处理

怎样同时处理多个客户端的请求呢?两种方式,异步(async 和 await)和多线程(Task.Run)。
异步通常更为推荐,因为它更高效且易于管理
多线程
用Task.Run(() => HandleClientAsync(client)); 会将 HandleClientAsync 方法的执行放到一个新的任务中,这个任务会在线程池中运行。
多线程结合异步
💡
一番操作下来,其实很好理解,网络传输的本质就是传递字节流(byte),无论是文件还是其他类型的数据。然后通过IO操作读取和处理这些字节流,通过序列化/反序列化来还原成原始的数据结构进行使用。
 
上一篇
帧同步和状态同步
下一篇
Unity—TimeLine

Comments
Loading...