JAVA NIO는 UDP 전송기를 달성

장면은 UDP를 통해 여러 클라이언트 매우 간단합니다, (어떤 연결, 즉, 서버가 클라이언트의 IP에 대한 정보를 저장하지 사실) 서버에 연결합니다. 그런 다음 서버는 각 고객 단말기를 전달하여 UDP 및 UDP 서버를 통해 제 1 프로토콜의 메시지를 전송한다.
이것은 아닌 관찰자 패턴의
서버 코드

public class Server {
    private static LinkedList<SocketAddress> list=new LinkedList<SocketAddress>();
    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<SelectionKey> keys = selector.selectedKeys();
            Iterator<SelectionKey> 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;
    }
}

클라이언트 코드

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();
        }
    }
}

추천

출처www.cnblogs.com/duangL/p/11732168.html