Java的NIO包中,有一个专门用于发送UDP数据包的类:DatagramChannel, UDP是一种无连接的网络协议,
一般用于发送一些准确度要求不太高的数据等。
<强>完整的服务端程序如下:强>
公开课StatisticsServer {//每次发送接收的数据包大小 私人最终int MAX_BUFF_SIZE=1024 * 10;//服务端监听端口,客户端也通过该端口发送数据 私人int端口; 私人DatagramChannel通道; 私人选择器选择器; 私人ScheduledExecutorService es=Executors.newScheduledThreadPool (1); 公共空间init()抛出IOException {//创建通道和选择器 选择器=Selector.open (); 频道=DatagramChannel.open ();//设置为非阻塞模式 channel.configureBlocking(假); channel.socket ()。bind(新的InetSocketAddress(端口));//将通道注册至选择器,监听只读消息(此时服务端只能读数据,无法写数据) 通道。注册(选择器,SelectionKey.OP_READ);//使用线程的方式,保证服务端持续等待接收客户端数据 es。scheduleWithFixedDelay(新Runnable () { @Override 公共空间run () { 尝试{ 而(selector.select()在0) { Iterator迭代器=selector.selectedKeys () .iterator (); 而(iterator.hasNext ()) { SelectionKey关键=iterator.next (); 尝试{ iterator.remove (); 如果(key.isReadable ()) {//接收数据 doReceive(关键); } }捕捉(异常e) { 记录器。错误(“SelectionKey接收异常”,e); 尝试{ 如果(关键!=null) { key.cancel (); .close key.channel () (); } }捕捉(ClosedChannelException cex) { 记录器。错误(“关闭通道异常”,cex); } } } } }捕捉(IOException e) { logger.error(“选择器。选择例外”,e); } } },0 l 2 l, TimeUnit.MINUTES); }//处理接收到的数据 私人空间doReceive (SelectionKey键)抛出IOException { 字符串内容=" "; DatagramChannel sc=(DatagramChannel) key.channel (); ByteBuffer缓冲=ByteBuffer.allocate (MAX_BUFF_SIZE); buffer.clear (); sc.receive(缓冲); buffer.flip (); 而(buffer.hasRemaining ()) { byte [] buf=new byte [buffer.limit ()); buffer.get (buf); 内容+=新的字符串(buf); } buffer.clear (); logger.debug(“接收内容=" +内容); 如果(StringUtils.isNotBlank(内容)){ doSave(内容); } } }
<强>客户端发送完整例子如下:强>
DatagramChannel频道=DatagramChannel.open (); StringBuilder某人=new StringBuilder (); sb.append (“2017-03-09 12:30:00;”) .append (“aaa”) .append (“testapp;“) .append (“test.do;“) .append(“参数=你好;”) .append(“测试”,) .append (“100”) .append (" 1 "); ByteBuffer缓冲=ByteBuffer.allocate (10240); buffer.clear (); .getBytes buffer.put (sb.toString () ()); buffer.flip ();//此处IP为服务端IP地址,端口和服务端的端口一致 int n=通道。发送(缓冲,新的InetSocketAddress (127.0.0.1, 8080)); System.out.println (n);//每次数据发送完毕之后,一定要调用亲密的方法,来关闭占用的udp端口,否则程序不结束,端口不会释放channel.close ();
以上就是本文关于Java NIO实例UDP发送接收数据代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:
Rxjava功能操作符的使用方法详解
分享一个简单的java爬虫框架
Javaweb应用使用限流处理大量的并发请求详解
有什么问题可以随时留的言,小编会及时回复大家的。感谢朋友们对本站的支持!