当前位置: 首页 > news >正文

服务器与客户端通讯测试

服务器与客户端通讯测试

  • 1 服务器与客户端通讯建立
    • 1.1 Main函数
    • 1.2 开启服务器
    • 1.3 客户端连接服务器
    • 1.4 扩展类
  • 2 测试过程
    • 2.1 测试1
    • 2.2 测试2
    • 2.3 测试3
    • 2.4 测试4
  • 3 测试总结

  • 测试服务器与客户端通讯时,发现数据丢包问题非常严重,肯定是自己的问题不会是通讯的问题,经过一系列的测试发现果然是自己的问题。
  • 实际上并未发生丢包,是自己测试的方式有问题,请看一下代码:

1 服务器与客户端通讯建立

  • 在main函数中调用了开启服务器,并处理客户端连接服务器;
  • 服务器监听客户端连接,并开启线程处理客户端发送的消息;
  • 客户端连接服务器后,开启线程一直向服务器发送消息。

1.1 Main函数

static void Main(string[] args)
{
    string ip = "127.0.0.1";
    int port = 1234;

    Server(ip, port);

    Client(ip, port);

 	Console.ReadKey();
}

1.2 开启服务器

/// <summary>
/// 开启服务器、监听客户端连接、并为(每个)客户端创建线程处理通信
/// </summary>
private static void Server(string ip, int port)
{
    TcpListener server = new TcpListener(IPAddress.Parse(ip), port);
    server.Start();

    new Task(() =>
    {
        while (true)
        {
            //等待客户端连接
            TcpClient client = server.AcceptTcpClient();

            //为(每个)客户端创建线程处理通信
            new Task(() =>
            {
                NetworkStream stream = client.GetStream();
                byte[] buffer = new byte[1024];

                while (true)
                {
                    // 异步读取客户端发送的消息
                    int bytesRead = stream.Read(buffer, 0, buffer.Length);
                    if (bytesRead == 0)
                        break;
                    Thread.Sleep(0);
                }
            }).Start();
        }

    }).Start();
}

1.3 客户端连接服务器

/// <summary>
/// 客户端连接服务器,一直向服务器发送消息
/// </summary>
private static void Client(string ip, int port)
{
    var client = new TcpClient();
    client.Connect(IPAddress.Parse(ip), port);
    new Task(() =>
    {
        NetworkStream stream = client.GetStream();
        byte[] buffer = { 0xAA, 0xBB, 0x03, 0x04, 0x5, 0x55 };

        while (true)
        {
            stream.Write(buffer, 0, buffer.Length);
            Thread.Sleep(0);
        }
    }).Start();

}

1.4 扩展类

public static class Extension
{
    public static string IntToString(this int num)
    {
        return num.ToString().PadLeft(2, '0');
    }

    public static string ByteToString(this byte b)
    {
        return Convert.ToString(b, 16).PadLeft(2, '0').ToUpper() + " ";
    }
}

2 测试过程

2.1 测试1

客户端连接服务器后一直向服务器发送消息

var client = new TcpClient();
client.Connect(IPAddress.Parse(ip), port);
new Task(() =>
{
    NetworkStream stream = client.GetStream();
    byte[] buffer = { 0xAA, 0xBB, 0x03, 0x04, 0x5, 0x55 };

    while (true)
    {
        stream.Write(buffer, 0, buffer.Length);
        Thread.Sleep(0);
    }
}).Start();

那么我们期望服务器每次接受到的消息应该是(如下图),因为我们每次发了一个数据包,也希望服务器接受到的数据包是完整的包,然而之际通讯中并非如此。
在这里插入图片描述
实际上,服务器接收到的数据包是这样的(如下图),当我让服务器没隔两秒接受一次数据时,发现服务器接受到的数据已经装满了整个缓冲区,但是包是按照客户端发送过来的数据完整排列的。
在这里插入图片描述

2.2 测试2

根据测试1,我想看看是不是服务器延迟接受后,数据包真的是按照客户端发送消息的顺序获取的吗,因此我又做了以下测试,客户端发送数据如下,包的大小为1,每次发送自增1:
在这里插入图片描述
我们来看看服务器接受到的数据包,看下图其实我们期望看到的结果。
在这里插入图片描述

2.3 测试3

客户端不间断发送固定大小(包的大小为6)的数据包
在这里插入图片描述
服务器每间隔500毫秒接受一次数据,并且设置缓冲区大小与客户端包的大小相同(包的大小为6),发现服务器接受到了所有的数据,并且是按照整个包接受数据的。
在这里插入图片描述

2.4 测试4

客户端每间断500毫秒,发送固定大小(包的大小为6)的数据包
在这里插入图片描述
服务器不间断的获取客户端消息,设置服务器接受缓冲区(1024)大于客户端发送数据包的大小,
在这里插入图片描述

3 测试总结

  1. 通过上面4种测试方式,我们发现在TCP通讯中无论客户端如何发送数据,服务器都是能够接受到数据的,那么我们就可以理解这句话:

TCP协议(Transimission Control Protocol)是以一种面向连接的、可靠的、基于字节流的传输层通信协议。”;

  1. 由于个人对TCP通讯理解不到位,平常都是以发送指令后等待回复指令,对于高频率的数据传输一般已经定义好了一个数据包,在接受数据时已经知道了发送端数据包的大小,对应的接受数据时设置了相同大小缓冲区,导致我认为我发送了一个包那么获取到的应该也是一个完成的数据包,这个问题我测试了4个小时。
  2. 当然TCP通讯时也不是不可能丢包,要是在不可靠的网络传输中也是会丢包的,常见的网络拥堵、网络故障、数据包碎片化也会导致丢包。

相关文章:

  • 2025年- G32-Lc106-133. 克隆图--java版(很抽象,没有很能理解)
  • Linux SSH远程登录
  • HCIA-Datacom高阶:基础的单区域 OSPF 与多区域 OSPF的配置
  • 关于IP免实名的那些事
  • 语音机器人与智能体结合
  • SpringAI与JBoltAI深度对比:从工具集到企业级AI开发范式的跃迁
  • (一)初始化窗口
  • 记录Jmeter 利用BeanShell 脚本解析JSON字符串
  • MAC安装docker 后提示com.docker.vmnetd”将对您的电脑造成伤害
  • MySQL 语句解析json字符串
  • 基于SpringBoot的“交通旅游订票系统”的设计与实现(源码+数据库+文档+PPT)
  • 【笔记】在windows使用docker管理mysql版本
  • JS—异步编程:3分钟掌握异步编程
  • cordova android12+升级一些配置注意事项
  • 3. 轴指令(omron 机器自动化控制器)——>MC_CamOut
  • 【Mac】npm error Error: EACCES: permission denied, mkdir‘/Users/...
  • 从零到一:ESP32与豆包大模型的RTC连续对话实现指南
  • 【Git 暂存操作指南2】
  • 网盘解析工具1.3.0,修改了一些bug,建议更新到此版本
  • 发票管理自动化-发票查验接口让财务告别繁琐的核验流程
  • 宜昌全域高质量发展:机制创新与产业重构的双向突围
  • 肖峰读《从塞北到西域》︱拉铁摩尔的骆驼
  • 国家主席习近平会见斯洛伐克总理菲佐
  • 欧盟公布关税反制清单,瞄准美国飞机、汽车等产品
  • 华为鸿蒙电脑正式亮相,应用生态系统能否挑战Windows?
  • 《2025城市青年旅行消费报告》发布,解码青年出行特征