type
status
date
slug
summary
tags
category
icon
password
身为游戏前端,做需求时和后端的对接联调总是很频繁,由此就想弄懂网络协议收发的原理到底是什么,想不如做,在C#中,我们可以用
System.Net.Sockets
命名空间中的TcpClient
和TcpListener
类来模拟客户端-服务器网络协议的发送、接收和回复。服务器处理
TcpListener
用于监听来自客户端的连接请求。
AcceptTcpClient()
方法接受客户端的连接,并返回一个TcpClient
对象。
NetworkStream
用于与客户端进行数据交换。
Read()
方法从网络流中读取数据,Write()
方法向网络流中写入数据。
客户端处理
TcpClient
用于连接到指定的服务器。
NetworkStream
用于与服务器进行数据交换。
Write()
方法向网络流中写入数据,Read()
方法从网络流中读取数据。
🤗 运行步骤
- 启动服务器:首先运行服务器端程序。它将开始监听指定端口(如8888),等待客户端连接。
- 启动客户端:然后运行客户端程序。它将连接到服务器并发送一条消息。
- 查看输出:在控制台中,你将看到服务器和客户端的交互过程。
📎 结论
启动服务器

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

服务器收到消息并回复

📎 扩展
异常处理
在现有的TCP服务器代码中还可以添加异常处理机制,用
try-catch
块来捕获处理可能发生的的网络异常,例如连接失败、超时等try-catch
块:将主要的网络操作放在try
块中,捕获可能的异常。
SocketException
:捕获与套接字相关的异常,如连接失败、超时等。
IOException
:捕获与输入输出相关的异常。
Exception
:捕获所有其他未预见的异常。
finally
块:确保无论是否发生异常,服务器监听器都会被正确停止。
多请求处理
怎样同时处理多个客户端的请求呢?两种方式,异步(
async
和 await
)和多线程(Task.Run
)。异步通常更为推荐,因为它更高效且易于管理
多线程
用Task.Run(() => HandleClientAsync(client));
会将 HandleClientAsync
方法的执行放到一个新的任务中,这个任务会在线程池中运行。多线程结合异步
一番操作下来,其实很好理解,网络传输的本质就是传递字节流(byte),无论是文件还是其他类型的数据。然后通过IO操作读取和处理这些字节流,通过序列化/反序列化来还原成原始的数据结构进行使用。
- Author:lzzd
- URL:https://lazy-zed.com/article/server_2
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!