客户端代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net.Sockets;
using System.Threading;
using System.Net;

namespace p2p
{
    public partial class Form1 : Form
    {
        private Thread th;
        private UdpClient tcpl;
        public bool listenerRun = true;
        Socket s;
        //listenerRun为true,表示可以接受连接请求,false则为结束程序

public Form1()
        {
            InitializeComponent();

Control.CheckForIllegalCrossThreadCalls = false;
        }
        public void Stop()
        {
            tcpl.Close();
            th.Abort();//终止线程
            MessageBox.Show("结束监听....");
        }

private void Form1_Load(object sender, EventArgs e)
        {

}

private void button1_Click(object sender, EventArgs e)
        {
           th = new Thread(new ThreadStart(Listen));//新建一个用于监听的线程
           th.Start();//打开新线程
        }

private void Listen()
        {
            try
            {
                tcpl = new UdpClient(5656);//在5656端口新建一个TcpListener对象
                IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 5656);
                MessageBox.Show("正在监听中....");
                 while (listenerRun)//开始监听
                 {
                     Byte[] stream = new Byte[80];
                     stream = tcpl.Receive(ref groupEP);
                   
                     MessageBox.Show(groupEP.ToString() + System.Text.Encoding.UTF8.GetString(stream));               
                }
            }
            catch (Exception ex)
            {
             MessageBox.Show(ex.Message);
            }
            
        }

private void button3_Click(object sender, EventArgs e)
        {
            th = new Thread(new ThreadStart(Send));//新建一个用于监听的线程
            th.Start();//打开新线程
        }

public void Send()
        {
            try
            {
                 s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                 IPAddress broadcast = IPAddress.Parse(this.textBox3.Text.Trim());
                 byte[] sendbuf = Encoding.UTF8.GetBytes(this.textBox2.Text.Trim());
                IPEndPoint ep = new IPEndPoint(broadcast, 5270);
                s.Connect(ep);
                s.SendTo(sendbuf, ep);
                while (true)
                {
                    byte[] data = new byte[2048];
                    int rect = s.Receive(data);
                    byte[] chat = new byte[rect];
                    Buffer.BlockCopy(data, 0, chat, 0, rect);
                    textBox1.AppendText(System.Text.Encoding.Default.GetString(chat));
                } 
               }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

}
            finally
            {
              
            }
            
        }

private void button2_Click(object sender, EventArgs e)
        {
            Stop();
        }

}
}

服务端代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Collections;

namespace p2pserver
{
    public partial class Form1 : Form
    {
        private Thread th;
        private UdpClient tcpl;
        public bool listenerRun = true;
        private ArrayList pclient;//
        IPEndPoint groupEP;
        public Form1()
        {
            InitializeComponent();
            this.button2.Enabled = false;
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        private void Listen()
        {
            try
            {
                tcpl = new UdpClient(5270);//在5656端口新建一个TcpListener对象
                 groupEP = new IPEndPoint(IPAddress.Any, 5270);
                 pclient = new ArrayList();
                while (listenerRun)//开始监听
                {
                    pclient.Add(groupEP);    
                    Byte[] stream = new Byte[80];
                    stream = tcpl.Receive(ref groupEP);
                    this.textBox1.AppendText(groupEP.ToString() + System.Text.Encoding.UTF8.GetString(stream));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {

}
        }
        public void Stop()
        {
            try
            {
              tcpl.Close();
                th.Abort();//终止线程
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
      
        private void button1_Click(object sender, EventArgs e)
        {
            this.button1.Enabled = false;
            this.button2.Enabled = true;
            th = new Thread(new ThreadStart(Listen));//新建一个用于监听的线程
            th.Start();//打开新线程
        }

private void button2_Click(object sender, EventArgs e)
        {
            this.button2.Enabled = false;
            this.button1.Enabled = true;
            Stop();
        }

private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                int index = int.Parse(this.textBox3.Text.Trim());
                byte[] bytesMsg = Encoding.Default.GetBytes(this.textBox2.Text.Trim());
                IPEndPoint sc = (IPEndPoint)pclient[index];
                tcpl.Send(bytesMsg, bytesMsg.Length, sc);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

转载于:https://www.cnblogs.com/top5/archive/2010/03/29/1699479.html

UDP协议下内网与公网IP进行发送消息,一对多.且选择不同的客户端发送消息相关推荐

  1. frp内网穿透-公网IP低成本使用高性能kali

    frp内网穿透-公网IP低成本使用高性能kali 1.frp Github项目地址:https://github.com/fatedier/frp 找到最新的releases下载,系统版本自行确认. ...

  2. nat123端口映射: 外网通过ssh访问内网非公网ip的服务器

    问题描述 LINUX部署在内网环境,没有公网IP,在内网可以上外网.如何实现在外网SSH访问内网LINUX主机? 解决方法: 使用nat123端口映射,一步映射即可将内网LINUX地址映射到外网,实现 ...

  3. python脚本获取内网,公网ip

    2019独角兽企业重金招聘Python工程师标准>>> 获取内网ip: get_inner_ipaddr.py #!/usr/bin/env python import socket ...

  4. Cisco NAT --- 从内网用公网IP地址访问内网服务器

    好吧,我承认这个标题挺难读 , 从一会儿内网一会儿公网一会儿又内网的. 但是这确实一个很实在的问题.如果你用的是ASA或其他防火墙,可以直接 跳过,这东西对防火墙来说实现起来太容易.我们的目标还是思科 ...

  5. 内网穿透妙用——内网转公网nat123

    公网下访问私有云盘--NAT123免费圆梦 根据前两期发布的关于个人网盘搭建的博客(个人网盘配置--以Cloudreve为例),博主进行了进一步的更新维护,由于初始配置版本是基于局域网组建的,在小型办 ...

  6. RTSP协议网络摄像头如何实现内网到公网的无插件直播,同时支持微信扫码直播观看?

    目前,微信用户已达12亿人,自媒体时代扑面而来,微信视频扫码直播颠覆传统,成为在线视频直播发展的方向.当微信成为人们日常的习惯应用,围绕微信形成的在线视频直播生态企业也在悄然崛起. 最近在项目交流过程 ...

  7. 什么是内网、公网和NAT?

    一.内网.公网和NAT的定义 内网也叫局域网,从范围上来讲内网就是小部分的网络,一般指的是特定环境下组成网络,比如某一个家庭多台计算机互联成的网络,也可以学校和公司的大型局域网,内网的IP一般都是19 ...

  8. 【Minecraft开服教学】使用 MCSM 面板一键搭建我的世界服务器 并使用内网穿透公网远程联机

    文章目录 前言 1.Mcsmanager安装 2.创建Minecraft服务器 3.本地测试联机 4. 内网穿透 4.1 安装cpolar内网穿透 4.2 创建隧道映射内网端口 5.远程联机测试 6. ...

  9. 什么是内网、公网和NAT?读懂这一篇就够!

    我们做弱电监控系统的时候,都避免不了要跟IP地址打交道,比如摄像头.NVR.服务器等这些设备安装好之后,就需要给它们配上IP,那这个IP地址你了解嘛?今天我们就一起来聊聊什么是内网.公网和NAT地址转 ...

最新文章

  1. Dijkstra算法--有向图的源点到其他顶点的最短路径(连接矩阵、邻接矩阵两种方式)
  2. mysql图标_MySQL 支持 emoji 图标存储
  3. php针对中文的字符串函数,php截取中文字符串函数实例_php技巧
  4. java对象创建的流程到底是什么样子的?new一个对象是真的直接放在堆里吗?其实大有学问!
  5. .net上传,一个选择直接上传(ashx)和byteArray上传
  6. ActiveMQ持久化到mysql
  7. 阿里云mysql 日志_mysql日志-阿里云开发者社区
  8. 4. MyBatis几个可以优化的地方
  9. 5930. 两栋颜色不同且距离最远的房子
  10. 将结构体数据存储到一段字符串string中
  11. mosquitto鉴权插件的开发与说明(一)
  12. port security violation protect retrict shutdown 之具体解释
  13. [河南省ACM省赛-第四届] 表达式求值(nyoj 305)
  14. python绘制子图去掉x轴坐标值_python – 关闭图形的所有子图的轴
  15. 单行溢出隐藏没生效_至今没搞懂,为什么这个缸这么火?
  16. 手机锁屏后微信收款语音不播报?-by:nixs
  17. 通信原理与MATLAB(三):SSB的调制解调
  18. 从攻击事件分析加密攻击类型、工具、防范方法和未来预测
  19. java实现3D动态效果_js实现3D粒子酷炫动态旋转特效
  20. Matlab求齐次方程的解

热门文章

  1. linux命令-- 抓包
  2. dmalloc用法快速入门
  3. Hibernate sqlserver 的对象转成 Hibernate mysql 的对象时 需注意
  4. Arcengine 10 ecp
  5. 渲染性能测试 , 结果比想象中好很多.
  6. 直接设置Activity的背景颜色
  7. Android Activity Launch Mode 启动模式详解
  8. android jni打印log信息
  9. 一文搞懂RSA算法原理及简单实现
  10. C# 执行Cmd窗口中的命令 [复制文件实例]