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));
        }
相关推荐
wen__xvn3 分钟前
C++ 中 std::set 的用法
java·c++·c#
沐知全栈开发13 分钟前
Pandas 相关性分析
开发语言
步步为营DotNet14 分钟前
深深度探索.NET 中HttpClient的复用策略:提升性能与稳定性的关键度解析.NET 中IServiceCollection:构建可扩展服务体系的关键
java·网络·.net
AI科技星18 分钟前
统一场论中电场的几何起源:基于立体角变化率的第一性原理推导与验证
服务器·人工智能·线性代数·算法·矩阵·生活
lifetime‵(+﹏+)′20 分钟前
5060显卡Windows配置Anaconda中的CUDA及Pytorch
人工智能·pytorch·windows
怀川28 分钟前
开源 NamBlog:一个博客外壳下的体验编译器
docker·ai·.net·博客·ddd·graphql·mcp
kylezhao20191 小时前
C#读取字节数组某个位的值
开发语言·c#
资生算法程序员_畅想家_剑魔1 小时前
Java常见技术分享-26-事务安全-锁机制-作用与分类
java·开发语言·数据库
qq_406176142 小时前
JS 事件循环(Event Loop)
开发语言·前端·javascript
weixin_433179332 小时前
python - for循环,字符串,元组基础
开发语言·python