多播程序设计(基于UDP协议)
首先要搞清楚多播IP地址有哪些
D类IP地址就是多播地址,范围是224.0.0.0 ~ 239.255.255.255
其中又划分为以下类别
D类地址的划分
| 类别 | 地址范围 | 描述 |
| 局部链接地址(本地网络控制块) | 224.0.0.0~224.0.0.255 | 用于局域网,路由器不转发属于此范围的IP包 |
| 预留多播地址 | 224.0.1.0~238.255.255.255 | 用于全球范围或网络协议 |
| 管理权限地址 | 239.0.0.0~239.255.255.255 | 组织内部使用,用于限制多播范围 |
服务器端:

private UdpClient udpSend;
private void button1_Click(object sender, EventArgs e)
{
//判断是否为空
if(this.richTextBox1.Text == "")
{
MessageBox.Show("Please input the text");
return;
}
//初始始UdpClient
udpSend = new UdpClient();
//允许发送和接收广播数据报
udpSend.EnableBroadcast = true;
//必须使用组播地址范围内的地址
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.0.0.10"), );
byte[] bytes = Encoding.UTF8.GetBytes(this.richTextBox1.Text);
//发送组播信息
try
{
udpSend.Send(bytes, bytes.Length, iep);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
this.richTextBox1.Text = "";
this.richTextBox1.Focus();
}
接收多播消息客户端

private void button2_Click(object sender, EventArgs e)
{
ReceiveMessage(this.richTextBox1);
}
用于接收多播消息的ReceiveMessage(RichTextBox textBox)方法
private void ReceiveMessage(RichTextBox textBox)
{
byte[] bytes = null; //在本机指定的端口进行接收
udpReceive = new UdpClient(); //将套接字加入组播组
udpReceive.JoinMulticastGroup(IPAddress.Parse("224.0.0.10"), ); //接收从远程主机发送过来的消息
IPEndPoint iep = new IPEndPoint(IPAddress.Loopback, );//这里是本地测试,所以写成环回地址
//如果是远程主机,则写成 IPEndPoint iep = new IPEndPoint(IPAddress.Any,0); while(true)
{
try
{
bytes = udpReceive.Receive(ref iep);
textBox.Text = Encoding.UTF8.GetString(bytes);
MessageBox.Show(Encoding.UTF8.GetString(bytes));
}
catch(Exception e)
{
MessageBox.Show(e.Message);
return;
}
}
}
上面接收的代码逻辑有点问题,因为接收完一次消息,还会一直等着接收下一次消息,会造成阻塞。来个if判断下就行了
设置端口号时的0是指自动分配
上面加入多播组时用到了TTL
TTL的极限约定
| 初始TTL | 约定 | 初始TTL | 约定 |
| 0 | 多播数据报被限制在同一个主机 | 64 | 多播数据报被限制在同一个地区 |
| 1 | 多播数据报被限制在同一个子网 | 128 | 多播数据报被限制在同一个本土 |
| 32 | 多播数据报被限制在同一个站点 | 255 | 没有范围限制 |
在窗体关闭事件中加上以下代码用来关闭UDP连接
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if(udpReceive != null)
udpReceive.Close();
}
多播程序设计(基于UDP协议)的更多相关文章
- 基于UDP协议模拟的一个TCP协议传输系统
TCP协议以可靠性出名,这其中包括三次握手建立连接,流控制和拥塞控制等技术.详细介绍如下: 1. TCP协议将需要发送的数据分割成数据块.数据块大小是通过MSS(maximum segment siz ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- JAVA基础知识之网络编程——-基于UDP协议的通信例子
UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...
- 基于UDP协议的控制台聊天
这几天学了java的网络编程弄出一个基于UDP协议的聊天工具 功能 添加并且备注好友(输入对方的ip) 删除好友 查看好友列表 用java写的控制台程序导出可执行程序后不能双击打开 还需要些一个脚本文 ...
- 基于UDP协议的网络编程
UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象. Java使用DatagramSock ...
- 网络编程应用:基于UDP协议【实现文件下载】--练习
要求: 基于UDP协议实现文件下载 发送方–请求–接收方发送文件–发送方接收文件 代码: 发送方: package Homework1; import java.io.File; import jav ...
- 基于UDP协议的socket编程
UDP协议特点: 1.无连接.服务端与客户端传输数据之前不需要进行连接,且没有超时重发等机制,只是把数据通过网络发送出去.也正是因为此特点,所以基于UDP协议的socket的客户端在启动之前不需要先启 ...
- 基于UDP协议的控制台聊天程序(c++版)
本博客由Rcchio原创,转载请告知作者 ------------------------------------------------------------------------------- ...
- Learning-Python【30】:基于UDP协议通信的套接字
UDP协议没有粘包问题,但是缓冲区大小要足够装数据包大小,建议不要超过 512 服务端: # 服务端 import socket server = socket.socket(socket.AF_IN ...
- python 全栈开发,Day34(基于UDP协议的socket)
昨日内容回顾 网络的基础概念arp协议 :通过ip地址找到mac地址五层模型 : 应用层 传输层 网络层 数据链路层 物理层tcp协议 : 可靠的 面向连接 全双工 三次握手 四次挥手udp协议 : ...
随机推荐
- 高性能JavaScript 达夫设备
前言 在<高性能JavaScript>一书的第四章算法和流程控制中,提到了减少迭代次数加速程序的策略—达夫设备(Duff's device).达夫设备本身很好理解,但是其效果是否真的像书中 ...
- C#中数组Array、ArrayList、泛型List<T>的比较
在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序 ...
- 一步一步学习ABP项目系列文章目录
1.概述 基于DDD的.NET开发框架 - ABP初探 基于DDD的.NET开发框架 - ABP分层设计 基于DDD的.NET开发框架 - ABP模块设计 基于DDD的.NET开发框架 - ABP启动 ...
- JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)
相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...
- Nginx 负载均衡
Nginx简单实现网站的负载均衡 地址:http://www.cnblogs.com/alvin_xp/p/4161162.html
- LLC 逻辑链路控制
LLC 协 议 4.2.1 LLC帧格式 LLC协议定义了LLC层之间通信的帧格式,参见图4.3. 图4.3 LLC帧格式 LLC帧格式中各个字段的含义如下: ① 服务访问点(SAP)地址:SA ...
- python基础--基本数据类型考试_day3
1.执行 Python 脚本的两种方式 终端和交互模式 法1:python helloword.py 法2:ps: 执行前需给预chmod 755 helloword.py (linux系统中)./h ...
- 一个Activity掌握Android5.0新控件 (转)
原文地址:http://blog.csdn.net/lavor_zl/article/details/51279386 谷歌在推出Android5.0的同时推出了一些新控件,Android5.0中最常 ...
- 链表的Java实现
import java.lang.System; public class Hello { public static void main(String[] args) { LinkList List ...
- IntelliJ_设置
1.修改背景色.修改字体大小 http://blog.csdn.net/hpf911/article/details/16888797 2.显示行号 搜索Line Number 3.代码结构图 Vie ...