场景很简单,就是多个客户端通过udp,连接到服务器(其实是无连接的,就是服务器保存了客户端的ip信息)。然后通过udp协议先服务器发送消息,然后服务器在通过udp转发在各个客服端。

这个是不是 观察者模式

server代码

public class Server {

private static LinkedList list=new LinkedList();

private static final ExecutorService executorService = Executors.newFixedThreadPool(4);//这里用多线程去转发,可以提高效率。emmm,udp没有3次握手,速度应该很快,多不多线程应该差不了太多

private static DatagramChannel server=null;

private static Selector selector=null;

static {

try{

server=DatagramChannel.open().bind(new InetSocketAddress(8889));

server.configureBlocking(false);

selector=Selector.open();

}catch (Exception e){

e.printStackTrace();

}

}

public static void main(String[] args)throws Exception {

server.register(selector, SelectionKey.OP_READ);

while (true){

if (selector.select()>0){

Set keys = selector.selectedKeys();

Iterator iterator = keys.iterator();

while (iterator.hasNext()){

SelectionKey selectionKey = iterator.next();

if (selectionKey.isReadable()){

String msg = readMsg(selectionKey);

broadcast(msg);

}

iterator.remove();

}}

}

}

public static void saveIP(SocketAddress address)throws Exception{

if (!list.contains(address)){

list.add(address);

System.out.println("新增ip:"+address);

}

System.out.println("当前udp 保存的ip数量:"+list.size());

}

public static void broadcast(String msg) throws Exception{

//DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length);

for (SocketAddress address:list

) {

ByteBuffer byteBuffer=ByteBuffer.wrap(msg.getBytes());

executorService.submit(new Runnable() {

@Override

public void run() {

try{

server.send(byteBuffer, address);

System.out.println(Thread.currentThread().getName()+":"+address+"发送成功");

}catch (Exception e){

System.out.println(Thread.currentThread().getName()+":"+address+"发送失败");

}

}

});

}

}

public static String readMsg(SelectionKey selectionKey)throws Exception{

DatagramChannel channel=(DatagramChannel)selectionKey.channel();

System.out.println(channel.getRemoteAddress()+":"+channel.getLocalAddress());

ByteBuffer byteBuffer=ByteBuffer.allocate(1024);

SocketAddress receive = channel.receive(byteBuffer);

saveIP(receive);

byteBuffer.flip();

String msg=new String(byteBuffer.array(),"utf-8");

System.out.println("收到消息:"+msg);

return msg;

}

}

client 代码

public class Client {

public static DatagramSocket socket=null;

public static void main(String[] args) throws Exception{

try {

socket=new DatagramSocket();

Scanner scanner=new Scanner(System.in);

String msg;

new Thread(()->{

try{

while (true){

byte[] arr=new byte[1024];

DatagramPacket packet=new DatagramPacket(arr,arr.length);

socket.receive(packet);

String m1=new String(packet.getData(),"utf-8");

System.out.println("受到服务器消息:"+m1);

}

}catch (Exception e){

e.printStackTrace();

}

}).start();

while (!(msg=scanner.nextLine()).equals("exit")){

DatagramPacket packet=new DatagramPacket(msg.getBytes(),msg.getBytes().length,new InetSocketAddress("127.0.0.1",8889));

socket.send(packet);

}

}finally {

socket.close();

}

}

}

java udp转发_JAVA NIO udp 实现 群转发相关推荐

  1. java io类型_Java NIO之Java中的IO分类

    前言 前面两篇文章(Java NIO之理解I/O模型(一).Java NIO之理解I/O模型(二))介绍了,IO的机制,以及几种IO模型的内容,还有涉及到的设计模式.这次要写一些更贴近实际一些的内容了 ...

  2. java 分布式同步_Java Web分布式集群搭建(三)——Session同步

    对于一个业务系统的Tomcat集群来说,必须保证同一个用户访问到任一台服务器上都可以维持之前操作的身份.比如在服务器A进行了登陆,那么在服务器B中也要同步该用户已登录的状态,这里就用到了Session ...

  3. Java与汽车_Java NIO:IO与NIO的区别

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

  4. nio java是什么_Java NIO 的前生今世 之一 简介

    简介 Java NIO 是由 Java 1.4 引进的异步 IO. Java NIO 由以下几个核心部分组成: Channel Buffer Selector NIO 和 IO 的对比 IO 和 NI ...

  5. java bytebuffer 读写_java nio bytebuffer文件读写问题

    为什么下面的代码从文件中读不出3和2来?importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOExc ...

  6. java netty教程_Java NIO框架Netty教程(一) – Hello Netty

    先啰嗦两句,如果你还不知道Netty是做什么的能做什么.那可以先简单的搜索了解一下.我只能说Netty是一个NIO的框架,可以用于开发分布式的Java程序.具体能做什么,各位可以尽量发挥想象.技术,是 ...

  7. java netty 教程_Java NIO框架Netty教程(十六)

    该图是OneCoder通过阅读Netty源码,逐渐记录下来的.基本可以说明Netty服务的启动流程.这里在具体讲解一下. 首先说明,我们这次顺利的流程是基于NioSocketServer的.也就是基于 ...

  8. java搭云梯_java nio为什么是通道(一):通往nio的云梯

    java nio的通道是一个全新的I/O实现,没有扩展或者继承其它的类或者包. 通过只能在字节缓冲区上操作,因此Channel是面向字节的接口,为什么要这样设计呢?主要是因为通道直接会和操作系统的I/ ...

  9. java框架白话_Java NIO框架Netty教程(二) 白话概念

    "Hello World"的代码固然简单,不过其中的几个重要概念(类)和 Netty的工作原理还是需要简单明确一下,至少知道其是负责什.方便自己以后更灵活的使用和扩展. 声明,笔者 ...

  10. java filechannel 空_Java NIO FileChanel

    http://www.cnblogs.com/interdrp/p/3785164.html(好) path--->path 耗时:49毫秒 pos:1048576 pos:2097152 po ...

最新文章

  1. java 编码过滤器_Java编码过滤器
  2. 使用getopt处理shell脚本的参数
  3. 百度编辑器修改,不让它自动替换html标签
  4. Arduino学习笔记35
  5. JZOJ 5454. 【NOIP2017提高A组冲刺11.5】仔细的检查
  6. 进入Linux单用户模式
  7. CS231n Convolutional Neural Networks for Visual Recognition------Python Tutorial
  8. 几种字符串到byte[] 数组转化为String 的方法
  9. Promise方法汇总
  10. 深圳安全研讨会圆满结束,PPT共享下载
  11. win10命令行快捷键
  12. 如何在PPT中制作动态图表,学会这种方法实在太简单
  13. 21受限玻尔兹曼机RBM
  14. 这个世界的本源不是物质,而是物质背后的基本秩序-柏拉图
  15. 【智能优化算法】改进的侏儒猫鼬优化算法(IDMO)附matlab代码
  16. 第一次系统发版的过程(一)
  17. java中英文汉语混合排序_Java编程实现中英混合字符串数组按首字母排序的方法...
  18. RC吸收和单C吸收对模式VDS和后级肖特基二极管的影响?
  19. 微生物和微生物组的定义以及发展史
  20. 亚马逊美国账号怎么注册?有什么条件?

热门文章

  1. Windows10重装专业版和mysql缺少dll文件或找不到入口点DLLRegisterServer问题处理
  2. 前端代码更新镜像后,浏览器显示缓存
  3. windows搭建共享文件服务器,利用Windows共享搭建文件服务器
  4. linux 之间复制文件,两台Linux服务器之间复制文件
  5. 摄像机标定到底是在干什么?
  6. Android蓝牙打印机打印图片文字
  7. 原神改文件换服务器,原神官服和b服怎么切换
  8. cefsharp远程调试工具
  9. 关于企业电子工单系统的解决方案
  10. html中居中方法,HTML中5种常见的居中方法