`
c86423908
  • 浏览: 3559 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

java NIO UDP通信

 
阅读更多

服务端代码

package com.aisuo.cn.run;

import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue;

public class AutoRunServer3 implements Runnable {

    private static final int port = 59000;

    private Charset cs = Charset.forName("utf-8");

    private static ByteBuffer sBuffer = ByteBuffer.allocate(514);

    private static ByteBuffer rBuffer = ByteBuffer.allocate(514);

    private Queue<Map<DatagramChannel, SocketAddress>> clientsQueue = new LinkedBlockingQueue<Map<DatagramChannel, SocketAddress>>();

    private static Selector selector;

    private static Queue<String> queue = new LinkedBlockingQueue<String>();

    public AutoRunServer3() {
        try {
            init();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void init() throws IOException {
        DatagramChannel serverSocketChannel = DatagramChannel.open();
        serverSocketChannel.configureBlocking(false);
        DatagramSocket serverSocket = serverSocketChannel.socket();
        serverSocket.bind(new InetSocketAddress(port));
        selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_READ);
        System.out.println("server start on port:" + port + ";" + new Date());
    }

    private void handle(SelectionKey selectionKey) throws IOException {
        DatagramChannel client = null;
        String receiveText = null;
        //int count = 0;
        if (selectionKey.isReadable()) {
            client = (DatagramChannel) selectionKey.channel();
            rBuffer.clear();
            //count = client.read(rBuffer);
            //if (count > 0) {
            SocketAddress sa = client.receive(rBuffer);
            System.out.println(sa);
            rBuffer.flip();
            System.out.println(rBuffer.get(0));
            System.out.println(rBuffer.toString());
            byte[] ba = rBuffer.array();

            System.out.println(client.toString() + ":" + CRC16M.getBufHexStr(ba));
            //dispatch(client, receiveText);
            setClient(client, receiveText, sa);
            //client = (DatagramChannel) selectionKey.channel();
            //client.register(selector, SelectionKey.OP_READ);
            //}
        }
    }

    private void setClient(DatagramChannel client, String info, SocketAddress sa) {
        String name = "[" + sa + ":" + Integer.toHexString(client.hashCode()) + "]";
        System.out.println("插入:" + name);
        Map<DatagramChannel, SocketAddress> map = new HashMap<DatagramChannel, SocketAddress>();
        map.put(client, sa);
        clientsQueue.offer(map);
    }

    private void dispatch(String sendMsg) throws IOException, InterruptedException {
        System.out.println("sendMsg:" + sendMsg);
        Map<DatagramChannel, SocketAddress> temp = clientsQueue.poll();
        for (Map.Entry<DatagramChannel, SocketAddress> cc : temp.entrySet()) {
            DatagramChannel dc = cc.getKey();
            SocketAddress sa = cc.getValue();
            sBuffer.clear();
            sBuffer.put(sendMsg.getBytes());
            sBuffer.flip();
            //输出到通道  
            if (null != sa)
                dc.send(ByteBuffer.wrap(sendMsg.getBytes()), sa);
        }
    }

    private void putCmd() {
        /*Scanner sc = new Scanner(System.in);
        String next = sc.next();
        System.out.println("输入:" + next);*/
        for (int i = 0; i < 10; i++) {
            queue.offer("test" + i);
        }

        System.out.println("queue:" + queue.size());
    }

    public static void putCmd(String cmd) {
        queue.offer(cmd);
    }

    public static void main(String[] args) {
        AutoRunServer3 ars = new AutoRunServer3();
        //ars.putCmd();
        new Thread(ars).start();
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (true) {
            try {
                selector.select();//返回值为本次触发的事件数  
                Set<SelectionKey> selectionKeys = selector.selectedKeys();
                for (SelectionKey key : selectionKeys) {
                    handle(key);
                }
                selectionKeys.clear();//清除处理过的事件  

                if (queue.size() > 0) {
                    String sendMsg = queue.poll();
                    if (null != sendMsg) {
                        //队列中存在需要发送的报文
                        dispatch(sendMsg);
                    }
                    System.out.println("Last_queue:" + queue.size());
                }
            } catch (Exception e) {
                e.printStackTrace();
                break;
            }
        }
    }

}

 客户端代码:

 

package com.aisuo.cn.run;

import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Set;

public class ClientTest implements Runnable {

    @Override
    public void run() {
        DatagramChannel channel = null;
        Selector selector = null;
        SocketAddress sa = null;
        int udpPort = 59000;
        try {
            channel = DatagramChannel.open();
            channel.configureBlocking(false);
            sa = new InetSocketAddress("192.168.1.103", udpPort);
            selector = Selector.open();
            channel.register(selector, SelectionKey.OP_READ);
            ByteBuffer input = ByteBuffer.allocate(64);
            input.clear();
            input.put((byte)0xaa);
            input.put((byte)0x55);
            input.put((byte)0x0c);
            input.put((byte)0x00);
            input.put((byte)0x37);
            input.put((byte)0x3f);
            input.put((byte)0x01);
            input.put((byte)0x26);
            input.put((byte)0x01);
            input.put((byte)0x80);
            input.put((byte)0x01);
            input.put((byte)0x00);
            input.put((byte)0x00);
            input.put((byte)0x00);
            input.put((byte)0xfc);
            input.put((byte)0x87);

            input.flip();
            
            int count = channel.send(input, sa);
            System.out.println(count);
            ByteBuffer byteBuffer = ByteBuffer.allocate(1000);
            int eventsCount = selector.select();
            System.out.println(eventsCount);
            if (eventsCount > 0) {
                Set<SelectionKey> selectedKeys = selector.selectedKeys();
                Iterator<SelectionKey> iterator = selectedKeys.iterator();
                while (iterator.hasNext()) {
                    SelectionKey sk = (SelectionKey) iterator.next();
                    if (sk.isReadable()) {
                        DatagramChannel datagramChannel = (DatagramChannel) sk.channel();
                        byteBuffer.clear();
                        SocketAddress isa = datagramChannel.receive(byteBuffer);
                        byteBuffer.flip();
                        System.out.println(Charset.defaultCharset().decode(byteBuffer).toString());
                        Thread.sleep(3000);//延时
                        datagramChannel.send(Charset.defaultCharset().encode("hello server"), isa);
                    }
                }
            }
        } catch (Exception e) {

        }
    }

    public static void main(String[] args) {
        new Thread(new ClientTest()).start();
    }
}

 

已测!!!!!

 

分享到:
评论

相关推荐

    java 基础知识之网络通信(TCP通信、UDP通信、多播以及NIO)总结

    主要介绍了java 基础知识之网络通信总结的相关资料,包括TCP通信、UDP通信、多播以及NIO,需要的朋友可以参考下

    基于Netty4实现的UDP双向通信源码

    本源码是《NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战》一文的服务端源码实现(Netty4版),详见:http://www.52im.net/thread-378-1-1.html

    服务端基于MINA2的UDP双向通信Demo演示(Java客户端)

    本源码是《NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示》一文的Java客户端源码实现,详见:http://www.52im.net/thread-373-1-1.html

    mina高性能Java网络框架.rar

    它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。 Mina最主要的工作就是把底层传输的字节码转换为Java对象,提供给应用程序;或者把应用程序返回的...

    java高手真经 光盘源码

    javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...

    Java高手真经(编程基础卷)光盘全部源码 免积分

    javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...

    Apache Mina Server 2.0 参考手册

    它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的...

    Apache-Mina-Server-2.0中文参考手册V1.0.docx

    TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务、虚拟机管道通信服务等), Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步 IO 默认...

    Java高手真经(编程基础卷)光盘全部源码

    javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...

    Mina Tcp实例

    Java NIO开发技术的 TCP/UDP通信协议Mina框架的实例开发,一个简单的小栗子!

    NIO框架Netty实现高性能高并发

    相比于传统基于Java序列化+BIO(同步阻塞IO)的通信框架,性能提升了8倍多。 事实上,我对这个数据并不感到惊讶,根据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精 心的设计...

    基础深化和提高-网络编程

    Java网络编程是指使用Java编程语言进行网络通信和相关操作的技术。通过Java的网络编程能力,开发人员可以创建客户端-服务器应用程序、实现数据传输、远程调用等功能。...NIO(New I/O):Java NIO提供了非阻

    mina中文开发手册.pdf

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP 协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等), Mina 可以帮助我们快速开发高性能、高...

    mina开发手册

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP 协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等), Mina 可以帮助我们快速开发高性能、高...

    Mina所需要的第三方jar

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高...

    Java基础知识点总结.docx

    线程通信 52 线程池 58 死锁 64 线程相关类 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五、 API 71 &lt; java.lang &gt;String字符串:★★★☆ 71 &lt; java.lang &gt;StringBuffer字符串缓冲区:★★★☆ 73 &lt; java....

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

Global site tag (gtag.js) - Google Analytics