C#中的Udp已经TCP 客户端发送/接收

C#中的Udp

cs 复制代码
  // TCP   面向长连接  面向流     
  // UDP   面向无连接   面向数据报    :UDP如何确定当前网络中的其客户端   广播

  Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  socket.Bind(new IPEndPoint(IPAddress.Any, 9009));//   一个UDP客户端

  Task.Run(() =>
  {
      byte[] buffer = new byte[1024];
      EndPoint iPEndPoint = new IPEndPoint(IPAddress.Any, 0);
      socket.ReceiveFrom(buffer, ref iPEndPoint);
      Console.WriteLine(Encoding.UTF8.GetString(buffer));
      // iPEndPoint  指的是哪个客户端发过来的
      // 启动后,发送一个广播,接收到广播后   给发广播的人一个回应
  });
  // 无连接   这个消息会往这个局域网里丢

  // 前面不需要连接动作
  //socket.SendTo(new byte[] { 0x01, 0x02 }, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666));


  Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  // Socket对象的配置属性
  socket1.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
  socket1.SendTo(new byte[] { 0x01, 0x02 }, new IPEndPoint(IPAddress.Parse("255.255.255.255"), 6666));

TCP 客户端发送/接收

cs 复制代码
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666));

// 同步处理
{
    //byte[] buffer, int offset, int size, SocketFlags socketFlags
    string msg = "Hello";
    byte[] data = Encoding.UTF8.GetBytes(msg);
    //for (int i = 0; i < 10; i++)
    {
        socket.Send(data, 0, data.Length, SocketFlags.None);
    }
    Console.ReadLine();
     发送  上位机(客户端)主动请求设备(服务器)
     通信过程,一问一答     请求-》响应   
     开始接收响应
    byte[] buffer = new byte[1024 * 1024];// 如果没有应用层协议规定
     长度   ModbusTCP  请求多少个寄存器   返回的特定的长度
     TCP  : 面向数据流,没有明显边界    数据包中记录有效字节数    S7
    Console.WriteLine("开始接收");
    socket.Receive(buffer);// 1、有数据进来   不会就卡住       2、确保字节的长度
    Console.WriteLine("接收完成");
    //Send有没有时间间隔

    // 异步-》对应哪个发送的请求

    // 返回接收报文 
}

AutoResetEvent autoResetEvent = new AutoResetEvent(false);

// 异步读写
{
    string msg = "Hello";
    byte[] data = Encoding.UTF8.GetBytes(msg);
    var result = socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(ret =>
       {// 异步方法,同步的处理
           try
           {
               socket.EndSend(ret);

               // 发送未完成,就开始接收响应
               byte[] buffer = new byte[1024];
               Console.WriteLine("开始接收");
               //socket.Receive(buffer);
               //while (true)// 需要必须拿到数据才往下走
               {
                   var result = socket.BeginReceive(buffer, 0, 1024, SocketFlags.None, new AsyncCallback(DoAsync), socket);
                   bool s = result.AsyncWaitHandle.WaitOne(500);// 等待500毫秒    以内完成接收动作  
                   if (!s)
                       Console.WriteLine("接收超时");
                   //else
                   //    break;
                   autoResetEvent.Set();
               }
               // 耗时

               // 等待一个通知
               autoResetEvent.WaitOne();
               // 处理
               Console.WriteLine(Encoding.UTF8.GetString(buffer));
           }
           catch (Exception ex)
           {
               Console.WriteLine(ex.Message);
           }
       }), socket);
    //result.AsyncWaitHandle.WaitOne();
    Console.WriteLine("开始发送");
}
相关推荐
itzixiao1 天前
L1-041 寻找250(10分)
开发语言
南無忘码至尊1 天前
Unity学习90天-第3天-认识触屏输入(手游基础)并完成手机点击屏幕,物体向点击位置移动
学习·unity·c#·游戏引擎·游戏开发
njsgcs1 天前
获得solidworks 3d零件的包围框 长宽高 boundingbox c#
开发语言·c#·solidworks
网域小星球1 天前
C 语言从 0 入门(十九)|共用体与枚举:自定义类型进阶
c语言·开发语言·算法·枚举·自定义类型·共用体
哼?~1 天前
Socket--UDP 构建简单聊天室
linux·网络·udp
Evand J1 天前
【滤波代码介绍|MATLAB】粒子滤波(PF)与自适应粒子滤波(APF)在三维动态系统状态估计中的对比,使用Sage Husa自适应的思想
开发语言·matlab·pf·粒子滤波·apf·自适应滤波
zybsjn1 天前
异步并发的“流量警察”:在C#中使用SemaphoreSlim进行并发控制的最佳实践
开发语言·c#
南無忘码至尊1 天前
Unity学习90天-第3天-认识C# 集合与常用类并实现生成随机位置的 10 个立方体
学习·unity·c#
Cx330❀1 天前
线程进阶实战:资源划分与线程控制核心指南
java·大数据·linux·运维·服务器·开发语言·搜索引擎
人道领域1 天前
【黑马点评日记02】:Session+ThreadLocal实现短信登录
java·开发语言·spring·tomcat·intellij-idea