服务端代码
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,需要的朋友可以参考下
本源码是《NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战》一文的服务端源码实现(Netty4版),详见:http://www.52im.net/thread-378-1-1.html
本源码是《NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示》一文的Java客户端源码实现,详见:http://www.52im.net/thread-373-1-1.html
它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。 Mina最主要的工作就是把底层传输的字节码转换为Java对象,提供给应用程序;或者把应用程序返回的...
javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...
javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...
它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的...
TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务、虚拟机管道通信服务等), Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步 IO 默认...
javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...
Java NIO开发技术的 TCP/UDP通信协议Mina框架的实例开发,一个简单的小栗子!
相比于传统基于Java序列化+BIO(同步阻塞IO)的通信框架,性能提升了8倍多。 事实上,我对这个数据并不感到惊讶,根据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精 心的设计...
Java网络编程是指使用Java编程语言进行网络通信和相关操作的技术。通过Java的网络编程能力,开发人员可以创建客户端-服务器应用程序、实现数据传输、远程调用等功能。...NIO(New I/O):Java NIO提供了非阻
Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP 协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等), Mina 可以帮助我们快速开发高性能、高...
Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP 协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等), Mina 可以帮助我们快速开发高性能、高...
Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高...
线程通信 52 线程池 58 死锁 64 线程相关类 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五、 API 71 < java.lang >String字符串:★★★☆ 71 < java.lang >StringBuffer字符串缓冲区:★★★☆ 73 < java....
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...