• c#使用UDP进行聊天通信


    UDP和TCP都是网络通信中不可缺少的部分,两者在不同的环境中,应用的场景不一样,UDP在网络不好的情况下,传输会丢包,也就是会丢数据,而TCP不会这样,所以重要的数据使用TCP传输,但是TCP对网络的资源消耗非常的大,例如视频,音频等大量的数据,这个时候就选择UDP,因为UDP占用网络资源比较低,就算丢一帧二帧的图像的数据,也不会有影响的。UDP只管发送,不管你有没有接收到信息,比较主动,同理,也会一直接收,只要在线,就能接受对方的信息。UDP比TCP的使用更加的简单。

    UDP通信可以分为使用UDP和UdpClient。UdpClient是Socket的一种封装。其实UDP通信没有绝对的服务端和客户端分别,因为都是连接上,就可以发送和接收。

    使用UDP方式,需要注意发送消息的IP地址和端口与接收消息的IP地址和端口。

    服务端代码

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Net;
    5. using System.Net.Sockets;
    6. using System.Text;
    7. using System.Threading;
    8. using System.Threading.Tasks;
    9. namespace ConsoleApp1
    10. {
    11. class Program
    12. {
    13. static void Main(string[] args)
    14. {
    15. //udp 服务端
    16. Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    17. server.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6001));//绑定端口号和IP
    18. Console.WriteLine("服务端已经开启");
    19. Thread t = new Thread(()=>ReciveMsg(server));//开启接收消息线程
    20. t.Start();
    21. Thread t2 = new Thread(()=>sendMsg(server));//开启发送消息线程
    22. t2.Start();
    23. }
    24. static void sendMsg(Socket server)
    25. {
    26. EndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6000); //向指定的IP和端口发送消息
    27. while (true)
    28. {
    29. string msg = Console.ReadLine();
    30. server.SendTo(Encoding.UTF8.GetBytes(msg), point);
    31. }
    32. }
    33. static void ReciveMsg(Socket server)
    34. {
    35. while (true)
    36. {
    37. //EndPoint point = new IPEndPoint(IPAddress.Any, 0); //向所有的IP和端口接收消息
    38. EndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6000); //向指定的IP和端口接收消息
    39. byte[] buffer = new byte[1024];
    40. int length = server.ReceiveFrom(buffer, ref point);//接收数据报
    41. string message = Encoding.UTF8.GetString(buffer, 0, length);
    42. Console.WriteLine("收到了消息:" + message);
    43. }
    44. }
    45. }
    46. }

    客户端代码

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Net;
    5. using System.Net.Sockets;
    6. using System.Text;
    7. using System.Threading;
    8. using System.Threading.Tasks;
    9. namespace ConsoleApp2
    10. {
    11. class Program
    12. {
    13. static void Main(string[] args)
    14. {
    15. Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    16. client.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6000));
    17. Thread t = new Thread(() => sendMsg(client));
    18. t.Start();
    19. Thread t2 = new Thread(() => ReciveMsg(client));
    20. t2.Start();
    21. Console.WriteLine("客户端已经开启");
    22. }
    23. static void sendMsg(Socket client)
    24. {
    25. EndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6001); //向指定的IP和端口发送消息
    26. while (true)
    27. {
    28. string msg = Console.ReadLine();
    29. client.SendTo(Encoding.UTF8.GetBytes(msg), point);
    30. }
    31. }
    32. static void ReciveMsg(Socket client)
    33. {
    34. while (true)
    35. {
    36. //EndPoint point = new IPEndPoint(IPAddress.Any, 0); //向所有的IP和端口接收消息
    37. EndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6001); //向指定的IP和端口接收消息
    38. byte[] buffer = new byte[1024];
    39. int length = client.ReceiveFrom(buffer, ref point);//接收数据报
    40. string message = Encoding.UTF8.GetString(buffer, 0, length);
    41. Console.WriteLine("收到了消息:" + message);
    42. }
    43. }
    44. }
    45. }

    效果预览

    使用UdpClient方式,需要注意发送消息的IP地址和端口与接收消息的IP地址和端口

    服务端代码

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Net;
    5. using System.Net.Sockets;
    6. using System.Text;
    7. using System.Threading;
    8. using System.Threading.Tasks;
    9. namespace ConsoleApp1
    10. {
    11. class Program
    12. {
    13. static void Main(string[] args)
    14. {
    15. //创建udpclient 绑定ip跟端口号
    16. UdpClient udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8090));
    17. Console.WriteLine("UdpClient服务端已经开启");
    18. Thread t = new Thread(() => ReciveMsg(udpClient));//开启接收消息线程
    19. t.Start();
    20. Thread t2 = new Thread(() => sendMsg(udpClient));//开启发送消息线程
    21. t2.Start();
    22. }
    23. static void sendMsg(UdpClient udpClient)
    24. {
    25. while (true)
    26. {
    27. string message = Console.ReadLine();
    28. byte[] data = Encoding.UTF8.GetBytes(message);
    29. udpClient.Send(data, data.Length, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8091)); //发送到指定的IP地址和端口信息
    30. }
    31. }
    32. static void ReciveMsg(UdpClient udpClient)
    33. {
    34. while (true)
    35. {
    36. //接收数据
    37. //IPEndPoint point = new IPEndPoint(IPAddress.Any, 0); //接收所有的IP地址和端口信息
    38. IPEndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8091); //接收指定的IP地址和端口信息
    39. byte[] data = udpClient.Receive(ref point);//
    40. string message = Encoding.UTF8.GetString(data);
    41. Console.WriteLine("收到了消息:" + message);
    42. }
    43. }
    44. }
    45. }

    客户端代码

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Net;
    5. using System.Net.Sockets;
    6. using System.Text;
    7. using System.Threading;
    8. using System.Threading.Tasks;
    9. namespace ConsoleApp2
    10. {
    11. class Program
    12. {
    13. static void Main(string[] args)
    14. {
    15. //创建udpclient对象
    16. UdpClient client = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8091));
    17. Console.WriteLine("UdpClient客户端已经开启");
    18. Thread t = new Thread(() => sendMsg(client));
    19. t.Start();
    20. Thread t2 = new Thread(() => ReciveMsg(client));
    21. t2.Start();
    22. }
    23. static void sendMsg(UdpClient client)
    24. {
    25. while (true)
    26. {
    27. string message = Console.ReadLine();
    28. byte[] data = Encoding.UTF8.GetBytes(message);
    29. client.Send(data, data.Length, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8090));
    30. }
    31. }
    32. static void ReciveMsg(UdpClient udpClient)
    33. {
    34. while (true)
    35. {
    36. //接收数据
    37. //IPEndPoint point = new IPEndPoint(IPAddress.Any, 0); //接收所有的IP地址和端口信息
    38. IPEndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8090); //接收指定的IP地址和端口信息
    39. byte[] data = udpClient.Receive(ref point);
    40. string message = Encoding.UTF8.GetString(data);
    41. Console.WriteLine("收到了消息:" + message);
    42. }
    43. }
    44. }
    45. }

    效果预览

    从以上的案例来看,UDP和UdpClient的区别基本上都是一样的,一个使用了Socket 类,一个使用了UdpClient类,然后都是绑定对应的IP地址和端口,然后就是分别调用Socket类的方法,进行发送消息和接收消息,调用UdpClient类的方法,进行发送消息和接收信息。其实在新建类的时候,可以不用先进行连接,可以把IP地址和端口,以及消息一次性发出去。

    拓展

    单播,广播,多播三者的区别

    单播

    用于两个主机之间的端对端通信,指定了固定的IP地址和端口,就是一对一的对话,其他人听不到你们说的话,类似私聊。

    代码:就是上面的代码,指定了固定的IP地址和端口号,发送和接收都互相对应。

    广播

    用于一个主机对整个局域网上所有主机上的数据通信,就是一个人大声说话,所有的人都能听到,类似群聊。

    代码:修改成下面2句即可,发送端和接收端都要修改。

    UDP服务端

    1. server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true); //Broadcast开启广播
    2. EndPoint point = new IPEndPoint(IPAddress.Broadcast, 4567); //开启广播,端口是4567

    UDP客户端

     

    1. EndPoint iep = new IPEndPoint(IPAddress.Any, 4567); //任意ip,端口就是服务端的4567
    2. EndPoint point = new IPEndPoint(IPAddress.Any, 4567); //广播,端口是4567

     UdpClient服务端

    1. UdpClient udpClient = new UdpClient(new IPEndPoint(IPAddress.Any, 0));
    2. IPEndPoint point = new IPEndPoint(IPAddress.Broadcast, 4567); //开启广播,端口是4567

    UdpClient客户端

     

    1. UdpClient client = new UdpClient(new IPEndPoint(IPAddress.Any, 4567));
    2. IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);

    多播

    介于单播和广播之间,也叫组播,从名字上面就能知道,建立一个组,然后向组内的人员发送消息,就类似,微信临时拉一个群,指定群内的人,向群内通知信息。

    代码:修改成下面2句即可,发送端和接收端都要修改。

    加入多播

    1. udpClient.JoinMulticastGroup(IPAddress.Parse("224.0.0.0"));//将 UdpClient 添加到多播组;IPAddress.Parse将IP地址字符串转换为IPAddress 实例
    2. IPEndPoint multicast = new IPEndPoint(IPAddress.Parse("224.0.0.0"), 7788); //将网络终结点表示为 IP 地址和端口号 7788是目的端口

    退出多播

    1. udpClient.DropMulticastGroup(IPAddress.Parse("224.0.0.0"));//将 UdpClient 从多播组中移除;IPAddress.Parse将IP地址字符串转换为IPAddress 实例
    2. IPEndPoint multicast = new IPEndPoint(IPAddress.Parse("224.0.0.0"), 7788); //将网络终结点表示为 IP 地址和端口号 7788是目的端口

  • 相关阅读:
    深入理解Java IO流(第二篇)
    internship:熟悉项目代码的几个步骤
    css美化滚动条
    Swift 如何打造兼容新老系统的字符串分割(split)方法
    玩机搞机---卸载内置软件 无root权限卸载不需要的软件 安全卸载
    自动铣刀式分板机市场分析
    vxe-table 列表过滤踩坑_vxe-table筛选
    【T690 之十二】基于方寸EVB2开发板(T690芯片)构建基于GMSSL的文件系统的方式
    【Java基础】成员变量和局部变量及封装
    Tcl语言:基础入门(一)
  • 原文地址:https://blog.csdn.net/u012563853/article/details/126307114