C# SocketUDP服务器,组播

SocketUDP

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

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

控件:Button,TextBox,RichTextBox

打开自己服务器

cs 复制代码
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");
            }));

        }
    });
}

发送按钮事件

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

cs 复制代码
 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

cs 复制代码
        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是发来消息的地址 类型是endpoint
                    int count = socket.ReceiveFrom(buffer, 0, ref ip);
                    IPEndPoint i1 = ip as IPEndPoint; // 把endpoint类型 转成IPEndPoint

                    string 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));
        }
相关推荐
GIS数据转换器5 小时前
智慧林草“一张图“平台
java·大数据·服务器·前端·javascript·数据库·人工智能
fpcc5 小时前
跟我学C++中级篇—static_assert和assert
开发语言·c++
2401_885885045 小时前
国际语音php接口代码示例:PHP使用cURL快速调用语音发送API
android·开发语言·前端·人工智能·python·php·语音识别
智恒百亿5 小时前
5090八卡服务器整机技术解析与部署常见问题(FAQ)
运维·服务器
萌动的小火苗5 小时前
Linux进程线程面试题【无答案】
linux·运维·服务器·c语言·开发语言
cuijiecheng20185 小时前
Linux下ss命令用法
linux·运维·服务器
云上工程笔记5 小时前
4090 GPU 服务器适合哪些 AI 场景?2026 年显存、推理性能、租用价格和风险对比
运维·服务器·人工智能
AI视觉网奇5 小时前
图片转矢量图 算法总结
windows
datalover5 小时前
【无标题】
c#·linq
Zenova EdgeOS5 小时前
C++ 工业边缘 Boost.Asio 高级实战
开发语言·c++·边缘计算·工业网关