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

C# SocketUDP服务器,组播

SocketUDP

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

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

控件:Button,TextBox,RichTextBox

打开自己服务器

public Form1()
{InitializeComponent();//1创建一个服务器 绑定的是ip和端口号 192.168.107.83, 8080// 张三的终端 以后谁想跟张三聊的时候 发这个ip和端口号socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);socket.Bind(new IPEndPoint(IPAddress.Any, 8080));startReceive();
}
Socket socket;
void startReceive() 
{byte[] bs = new byte[1024];Task.Run(() =>{while (true){int count = socket.Receive(bs);string s = Encoding.UTF8.GetString(bs,0, count);this.Invoke((Action)(() =>{richTextBox1.AppendText(s + "\t\n");}));}});
}

发送按钮事件

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

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: 为本地管理组播地址,仅在特定的本地范围内有效

 public Form1(){InitializeComponent();}Socket socket;private void button1_Click(object sender, EventArgs e){//1创建socket对象socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//2 绑定ip和端口号socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.107.83"), 8080));//3 加入组播地址//SetSocketOption 添加套接字可配置选项//参数1.支持协议类型,//参数2 添加组播地址的功能//参数3 要组播的地址socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,new MulticastOption(IPAddress.Parse("224.0.0.188")));//4以后大家要是接受的话 接受组内发来的消息的时候 必须添接受组内代码//5 接收数据startReceive();     
}
void startReceive()
{new Thread(() =>{byte[] buffer = new byte[1024];while (true){int count = socket.Receive(buffer);string s = Encoding.UTF8.GetString(buffer, 0, count);richTextBox1.Invoke((Action)(() =>{richTextBox1.AppendText(s + "\t\n");}));}}).Start();
}//发送消息
private void button2_Click(object sender, EventArgs e)
{//发消息指定组地址进行发送,以后要求接受消息端口号和此处端口号保持一致socket.SendTo(Encoding.UTF8.GetBytes(this.textBox1.Text),new IPEndPoint(IPAddress.Parse("224.0.0.188"), 10086));
}

socket组播客户端

控件:

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

        public Form1(){InitializeComponent();}Socket socket;private void button1_Click(object sender, EventArgs e){//1创建socket对象socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//2 绑定ip和端口号socket.Bind(new IPEndPoint(IPAddress.Any, 10086));//3 设置组地址 对客户端加入指定组播地址内socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,new MulticastOption(IPAddress.Parse("224.0.1.188")));//4 接受消息Task.Run(() =>{while (true){byte[] buffer = new byte[1024];//int count = socket.Receive(buffer);EndPoint ip = new IPEndPoint(IPAddress.None, 0); //定义endpoint类型变量,终端类型//ReceiveFrom()接受数据的方法 从哪个终端发来的消息//参数3是发来消息的地址 类型是endpointint count = socket.ReceiveFrom(buffer, 0, ref ip);IPEndPoint i1 = ip as IPEndPoint; // 把endpoint类型 转成IPEndPointstring s = Encoding.UTF8.GetString(buffer, 0, count);richTextBox1.Invoke((Action)(() =>{richTextBox1.AppendText(i1.Address+":"+s + "\t\n");richTextBox1.SelectionStart=richTextBox1.Text.Length; richTextBox1.ScrollToCaret();}));}});}private void button2_Click(object sender, EventArgs e){//socket.SendTo(Encoding.UTF8.GetBytes("hello world"),//    new IPEndPoint(IPAddress.Parse("192.168.107.83"), 8080));if (Encoding.UTF8.GetBytes(this.textBox1.Text).Length>1024){return;}socket.SendTo(Encoding.UTF8.GetBytes(this.textBox1.Text),new IPEndPoint(IPAddress.Parse("224.0.1.188"), 10086));}

http://www.lryc.cn/news/386046.html

相关文章:

  • 上市公司绿色投资者原始数据+计算代码(2008-2022年)
  • Redis-主从复制-测试主从模式下的读写操作
  • Linux系统应用与设置(3):串口调试(minicom)
  • Qt | windows Qt6.5.3安卓环境搭建成功版(保姆级教程)
  • Chrome Extension如何让work flow在页面刷新、跳转继续执行任务
  • 数据库调优厂商 OtterTune 宣布停止运营
  • 4、面向对象-typescript
  • 大数据学习之分布式数据采集系统Flume学习
  • 谁用谁夸,为什么BI零售数据分析方案这么受欢迎?
  • 多路h265监控录放开发-(14)通过PaintCell自定义日历控件继承QCalendarWidget的XCalendar类
  • 安卓速度下载v1.0.5/聚合短视频解析下载
  • 从赛题切入谈如何学习数学建模
  • 江山欧派杯2024全国华佗五禽戏线上线下观摩交流比赛在亳州开幕
  • 怪兽充电一季度由盈转亏:营收大幅下滑,消费者投诉不断
  • 激光与相机融合标定汇总:提升融合算法的精度与可靠性(附github地址)
  • 市场拓展招聘:完整指南
  • Leetcode 501:二叉搜索树中的众数
  • esp8266 GPIO
  • ingress相关yaml文件报错且相关资源一切正常解决方法
  • 重要通知:据最新TEMU要求所有欧区车灯都需要能效标签(eu energy lable)
  • JAVA SDK 整合 AI 大语言模型
  • 【Apache Doris】如何实现高并发点查?(原理+实践全析)
  • 解决SpringMVC使用MyBatis-Plus自定义MyBaits拦截器不生效的问题
  • Swagger与RESTful API
  • MySQL84 -- ERROR 1524 (HY000): Plugin ‘msql_native_password‘ is not loaded.
  • 将Excel中的错误值#N/A替换成心仪的字符串,瞬间爱了……
  • AI大模型日报#0628:谷歌开源9B 27B版Gemma2、AI首次实时生成视频、讯飞星火4.0发布
  • 【随笔】提高代码学习水平(以更高的视角看事物)
  • 游戏AI的创造思路-技术基础-深度学习(5)
  • 基于SpringBoot养老院管理系统设计和实现(源码+LW+调试文档+讲解等)