• C# SocketUDP服务器,组播


    SocketUDP

    自己即是服务器又是客户端 ,在发消息只需要改成对方ip和端口号即可

    前提对方必须开启服务器 socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.107.72"), 8080));

    控件:Button,TextBox,RichTextBox

    打开自己服务器

    1. public Form1()
    2. {
    3. InitializeComponent();
    4. //1创建一个服务器 绑定的是ip和端口号 192.168.107.83, 8080
    5. // 张三的终端 以后谁想跟张三聊的时候 发这个ip和端口号
    6. socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    7. socket.Bind(new IPEndPoint(IPAddress.Any, 8080));
    8. startReceive();
    9. }
    10. Socket socket;
    11. void startReceive()
    12. {
    13. byte[] bs = new byte[1024];
    14. Task.Run(() =>
    15. {
    16. while (true)
    17. {
    18. int count = socket.Receive(bs);
    19. string s = Encoding.UTF8.GetString(bs,0, count);
    20. this.Invoke((Action)(() =>
    21. {
    22. richTextBox1.AppendText(s + "\t\n");
    23. }));
    24. }
    25. });
    26. }

    发送按钮事件

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. //发消息的一定要注意iphe端口号
    4. socket.SendTo(Encoding.UTF8.GetBytes(this.textBox1.Text),
    5. new IPEndPoint(IPAddress.Parse("192.168.107.73"), 8082));
    6. }

    Socket组播服务器

    组播需要使用组播地址,在 IPv4 中它的范围从 224.0.0.0 到 239.255.255.255,

    并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类

    224.0.0.0 ~ 224.0.0.255: 局部链接多播地址:是为路由协议和其它用途保留的地址,  

    只能用于局域网中,路由器是不会转发的地址 224.0.0.0 不能用,是保留地址  

    224.0.1.0 ~ 224.0.1.255: 为用户可用的组播地址(临时组地址),可以用于 Internet 上的。

    224.0.2.0 ~ 238.255.255.255: 用户可用的组播地址(临时组地址),全网范围内有效  

    239.0.0.0 ~ 239.255.255.255: 为本地管理组播地址,仅在特定的本地范围内有效

    1. public Form1()
    2. {
    3. InitializeComponent();
    4. }
    5. Socket socket;
    6. private void button1_Click(object sender, EventArgs e)
    7. {
    8. //1创建socket对象
    9. socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    10. //2 绑定ip和端口号
    11. socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.107.83"), 8080));
    12. //3 加入组播地址
    13. //SetSocketOption 添加套接字可配置选项
    14. //参数1.支持协议类型,
    15. //参数2 添加组播地址的功能
    16. //参数3 要组播的地址
    17. socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
    18. new MulticastOption(IPAddress.Parse("224.0.0.188"))
    19. );
    20. //4以后大家要是接受的话 接受组内发来的消息的时候 必须添接受组内代码
    21. //5 接收数据
    22. startReceive();
    23. }
    24. void startReceive()
    25. {
    26. new Thread(() =>
    27. {
    28. byte[] buffer = new byte[1024];
    29. while (true)
    30. {
    31. int count = socket.Receive(buffer);
    32. string s = Encoding.UTF8.GetString(buffer, 0, count);
    33. richTextBox1.Invoke((Action)(() =>
    34. {
    35. richTextBox1.AppendText(s + "\t\n");
    36. }));
    37. }
    38. }).Start();
    39. }
    40. //发送消息
    41. private void button2_Click(object sender, EventArgs e)
    42. {
    43. //发消息指定组地址进行发送,以后要求接受消息端口号和此处端口号保持一致
    44. socket.SendTo(Encoding.UTF8.GetBytes(this.textBox1.Text),
    45. new IPEndPoint(IPAddress.Parse("224.0.0.188"), 10086)
    46. );
    47. }

    socket组播客户端

    控件:

    两个按钮(客户端打开接收消息,发送),textbox,richtextBox

    1. public Form1()
    2. {
    3. InitializeComponent();
    4. }
    5. Socket socket;
    6. private void button1_Click(object sender, EventArgs e)
    7. {
    8. //1创建socket对象
    9. socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    10. //2 绑定ip和端口号
    11. socket.Bind(new IPEndPoint(IPAddress.Any, 10086));
    12. //3 设置组地址 对客户端加入指定组播地址内
    13. socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
    14. new MulticastOption(IPAddress.Parse("224.0.1.188")));
    15. //4 接受消息
    16. Task.Run(() =>
    17. {
    18. while (true)
    19. {
    20. byte[] buffer = new byte[1024];
    21. //int count = socket.Receive(buffer);
    22. EndPoint ip = new IPEndPoint(IPAddress.None, 0); //定义endpoint类型变量,终端类型
    23. //ReceiveFrom()接受数据的方法 从哪个终端发来的消息
    24. //参数3是发来消息的地址 类型是endpoint
    25. int count = socket.ReceiveFrom(buffer, 0, ref ip);
    26. IPEndPoint i1 = ip as IPEndPoint; // 把endpoint类型 转成IPEndPoint
    27. string s = Encoding.UTF8.GetString(buffer, 0, count);
    28. richTextBox1.Invoke((Action)(() =>
    29. {
    30. richTextBox1.AppendText(i1.Address+":"+s + "\t\n");
    31. richTextBox1.SelectionStart=richTextBox1.Text.Length;
    32. richTextBox1.ScrollToCaret();
    33. }));
    34. }
    35. });
    36. }
    37. private void button2_Click(object sender, EventArgs e)
    38. {
    39. //socket.SendTo(Encoding.UTF8.GetBytes("hello world"),
    40. // new IPEndPoint(IPAddress.Parse("192.168.107.83"), 8080));
    41. if (Encoding.UTF8.GetBytes(this.textBox1.Text).Length>1024)
    42. {
    43. return;
    44. }
    45. socket.SendTo(Encoding.UTF8.GetBytes(this.textBox1.Text),
    46. new IPEndPoint(IPAddress.Parse("224.0.1.188"), 10086));
    47. }

  • 相关阅读:
    NFC简析与应用
    你需要的免费热门API接口这里都有~
    MySQL表结构设计规范
    初学后端,如何做好表结构设计?
    P8 服务拆分-服务远程调用
    5分钟了解数据结构
    VScode的代码截图插件CodeSnap
    Linux相关概念及常见指令
    03 LaTex之标题页&摘要
    接口自动化必学的20个难点,学完至少涨5k
  • 原文地址:https://blog.csdn.net/weixin_73535261/article/details/139967982