今天有人问我Netty的UDP怎么使用,我自己尝试的去写一个Demo,在网上搜索了一下,关于Netty的UDP实现还是很少的,所以,今天写下这篇文章用来记录今天的一个简单Demo实现

不使用Netty的UDP实例:

UdpServer.java

packagecom.rainy.netty.udp02;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;/*** Created by smzdm on 16/8/10.*/

public classUdpServer {public static final int PORT = 30000;//定义每个数据报的最大大小为4KB

private static final int DATA_LEN = 4096;//定义接收网络数据的字节数组

byte[] inBuff = new byte[DATA_LEN];//以指定字节数组创建准备接收数据的DatagramPacket对象

private DatagramPacket inPacket =

newDatagramPacket(inBuff, inBuff.length);//定义一个用于发送的DatagramPacket对象

privateDatagramPacket outPacket;//定义一个字符串数组,服务器端发送该数组的元素

String[] books = newString[] {"疯狂Java讲义","轻量级Java EE企业应用实战","疯狂Android讲义","疯狂Ajax讲义"};public void init() throwsIOException {try{//创建DatagramSocket对象

DatagramSocket socket = newDatagramSocket(PORT);//采用循环接收数据

for (int i = 0; i < 1000; i++) {//读取Socket中的数据,读到的数据放入inPacket封装的数组里

socket.receive(inPacket);//判断inPacket.getData()和inBuff是否是同一个数组

System.out.println(inBuff ==inPacket.getData());//将接收到的内容转换成字符串后输出

System.out.println(newString(inBuff

,0, inPacket.getLength()));//从字符串数组中取出一个元素作为发送数据

byte[] sendData = books[i % 4].getBytes();//以指定的字节数组作为发送数据,以刚接收到的DatagramPacket的//源SocketAddress作为目标SocketAddress创建DatagramPacket

outPacket = newDatagramPacket(sendData

, sendData.length, inPacket.getSocketAddress());//发送数据

socket.send(outPacket);

}

}catch(Exception e) {

System.out.println(e.getMessage());

}

}public static void main(String[] args) throwsIOException {newUdpServer().init();

}

}

UdpClient.java

packagecom.rainy.netty.udp02;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.util.Scanner;/*** Created by smzdm on 16/8/10.*/

public classUdpClient {//定义发送数据报的目的地

public static final int DEST_PORT = 30000;public static final String DEST_IP = "127.0.0.1";//定义每个数据报的最大大小为4KB

private static final int DATA_LEN = 4096;//定义接收网络数据的字节数组

byte[] inBuff = new byte[DATA_LEN];//以指定的字节数组创建准备接收数据的DatagramPacket对象

private DatagramPacket inPacket =

newDatagramPacket(inBuff, inBuff.length);//定义一个用于发送的DatagramPacket对象

private DatagramPacket outPacket = null;public void init() throwsIOException {try{//创建一个客户端DatagramSocket,使用随机端口

DatagramSocket socket = newDatagramSocket();//初始化发送用的DatagramSocket,它包含一个长度为0的字节数组

outPacket = new DatagramPacket(new byte[0], 0, InetAddress.getByName(DEST_IP), DEST_PORT);//创建键盘输入流

Scanner scan = newScanner(System.in);//不断地读取键盘输入

while(scan.hasNextLine()) {//将键盘输入的一行字符串转换成字节数组

byte[] buff =scan.nextLine().getBytes();//设置发送用的DatagramPacket中的字节数据

outPacket.setData(buff);//发送数据报

socket.send(outPacket);//读取Socket中的数据,读到的数据放在inPacket所封装的字节数组中

socket.receive(inPacket);

System.out.println(new String(inBuff, 0, inPacket.getLength()));

}

}catch(Exception e) {

System.out.println(e.getMessage());

}

}public static void main(String[] args) throwsIOException {newUdpClient().init();

}

}

这两段代码是在网上搜罗的例子,

原文路径:http://blog.csdn.net/jiangxinyu/article/details/8161044

在这个例子中,我们可以看到,UDP的实现方式和TCP的实现方式上是不同的,UDP的实现在于,发送数据包,后面我也在网上查看了一些问题,关于粘包问题,我发现,网上部分说UDP有粘包问题,部分说没有UDP粘包问题,就算有也是很少量的不容易出现的问题,其实,我偏向于UDP没有粘包问题,因为UDP本身是按包发送,而且,UDP和TCP不一样,UDP是包完整就发送,而TCP在包完整的情况下,会判断是否值得发送,有发送缓存的实现,所以,综合分析,我觉得UDP应该是不存在粘包问题,拆包问题同样就没有了。

Netty实现UDP的案例,

NettyUdpServer.java

package com.rainy.netty.udp01;

import io.netty.bootstrap.Bootstrap;

import io.netty.buffer.ByteBuf;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelOption;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.SimpleChannelInboundHandler;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.DatagramPacket;

import io.netty.channel.socket.nio.NioDatagramChannel;

/**

* Created by smzdm on 16/8/10.

*/

public class NettyUdpServer {

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

Bootstrap b = new Bootstrap();

EventLoopGroup group = new NioEventLoopGroup();

b.group(group)

.channel(NioDatagramChannel.class)

.option(ChannelOption.SO_BROADCAST, true)

.handler(new UDPSeverHandler());

b.bind(9000).sync().channel().closeFuture().await();

}

}

class UDPSeverHandler extends SimpleChannelInboundHandler {

@Override

protected void messageReceived(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {

ByteBuf buf = (ByteBuf) packet.copy().content();

byte[] req = new byte[buf.readableBytes()];

buf.readBytes(req);

String body = new String(req, "UTF-8");

System.out.println(body);

}

@Override

public void channelRegistered(ChannelHandlerContext ctx) throws Exception {

super.channelRegistered(ctx);

System.out.println("I got it!");

}

}

NettyUdpClient.java

packagecom.rainy.netty.udp;importjava.net.InetSocketAddress;importio.netty.bootstrap.Bootstrap;importio.netty.buffer.Unpooled;importio.netty.channel.Channel;importio.netty.channel.ChannelHandlerContext;importio.netty.channel.ChannelOption;importio.netty.channel.EventLoopGroup;importio.netty.channel.SimpleChannelInboundHandler;importio.netty.channel.nio.NioEventLoopGroup;importio.netty.channel.socket.DatagramPacket;importio.netty.channel.socket.nio.NioDatagramChannel;importio.netty.util.CharsetUtil;/*** Created by smzdm on 16/8/10.*/

public classNettyUdpClient {public static voidmain(String[] args) {

EventLoopGroup group= newNioEventLoopGroup();try{

Bootstrap b= newBootstrap();

b.group(group).channel(NioDatagramChannel.class)

.option(ChannelOption.SO_BROADCAST,true)

.handler(newUdpClientHandler());

Channel ch= b.bind(0).sync().channel();//向网段类所有机器广播发UDP

ch.writeAndFlush(newDatagramPacket(

Unpooled.copiedBuffer("发送第一个UDP", CharsetUtil.UTF_8),new InetSocketAddress("127.0.0.1", 9000))).sync();if(!ch.closeFuture().await(15000)){

System.out.println("查询超时!!!");

}

}catch(Exception e) {

System.out.println(e.getMessage());

}finally{

group.shutdownGracefully();

}

}

}class UdpClientHandler extends SimpleChannelInboundHandler{

@Overridepublic voidmessageReceived(ChannelHandlerContext channelHandlerContext,

DatagramPacket datagramPacket)throwsException {

String response=datagramPacket.content().toString(CharsetUtil.UTF_8);if(response.startsWith("结果:")){

System.out.println(response);

channelHandlerContext.close();

}

}

@Overridepublic void exceptionCaught(ChannelHandlerContext ctx,Throwable cause)throwsException{

ctx.close();

cause.printStackTrace();

}

}

netty对应原文路径:http://www.tuicool.com/articles/Rry6biF

上面的例子作为参考进行的代码处理,发现这样就能使得代码正常发送,如果你需要获取对应的发送端的IP地址,那么,你可以使用

packet.sender().getAddress().getHostAddress();

进行获取发送端IP地址,本质上来说,这个UDP一般都是基于使用UDP的方式进行自定义协议方式实现业务功能,具体可以根据自己的文档格式进行对应的解析。这个方式,如果做过银行接口的,应该对这个接口实现方式有一定的认识。

本文暂时先写到这里,如果有什么问题,请留言。大家一起交流讨论NIO方面的问题,一起进步。

java udp nio_Java NIO UDP DEMO相关推荐

  1. java udp nio_Java NIO系列教程(十) Java NIO DatagramChannel

    原文链接    作者:Jakob Jenkov    译者:郑玉婷     校对:丁一 Java NIO中的DatagramChannel是一个能收发UDP包的通道.因为UDP是无连接的网络协议,所以 ...

  2. java buffer nio_Java NIO之Buffer(缓冲区)入门

    ​Java NIO中的缓存区(Buffer)用于和通道(Channel)进行交互.数据是从通道读入缓冲区,从缓冲区写入到通道中的. ​缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内 ...

  3. Java网络编程之UDP和TCP套接字

    文章目录 一. 网络编程概述 二. UDP网络编程 1. UDP套接字 2. UDP客户端回显服务器程序 2.1 UDP回显服务器 2.2 UDP客户端 2.3 UDP实现查词典的服务器 三. TCP ...

  4. Java实例练习——基于UDP协议的多客户端通信

    昨天学习了UDP协议通信,然后就想着做一个基于UDP的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区 ...

  5. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  6. Java实现简单的UDP编程

    Java实现简单的UDP编程 客户端 package com.udp.service;import java.net.DatagramPacket; import java.net.DatagramS ...

  7. 萌新解--Java网络编程之UDP

    Java网络编程之UDP UDP协议为无连接的通信协议,在传数据前发送端与接收端不会先建立连接,也就是你发我就收但不一定会收到哦,以我们自身为发送端,我们不会事先让接收方知道我要给接收方发数据啦.就像 ...

  8. Java——网络编程(UDP与TCP通信及实现聊天案例)

    目录 1.什么是网络通信协议? 2.TCP/IP协议 3.协议分类 3.1.UDP协议 3.2.TCP协议 4.网络编程三大要素 4.1.协议 4.2.IP地址 4.3.端口号 5.InetAddre ...

  9. 【Java 网络编程】UDP 简介

    文章目录 I UDP 简介 II UDP 不可靠性 III UDP 作用 IV UDP 报文头 V UDP 数据包长度 I UDP 简介 1. UDP : User Datagram Protocol ...

最新文章

  1. 服务器安全防护和保护措施方案—Vecloud
  2. 软链接与硬链接的区别;描述通配符与正则表达式的区别
  3. Java 算法 麦森数
  4. 神了,一次解决Java所有痛难点!
  5. Java IO实战操作(一)
  6. MXY-单点登陆系统
  7. 专利申请“技术交底书”的要素和撰写要求
  8. html泰勒展开,【转载】泰勒展开式
  9. 群发邮件平台你知道那个好吗,一款邮件群发100万封群发邮件平台
  10. 三进制 四进制计算机原理,基因编码为何选择了“四进制”,而不是计算机系统的“二进制”?...
  11. Problem A: 算法4-5:求子串位置的定位函数
  12. IT十年人生过客-二十五-双十一
  13. 高级操作!用 Python 在 Excel 里画出蒙娜丽莎
  14. Matlab从txt第二行开始读,MATLAB小技:从文本数据第n行开始读取
  15. 51单片机之串口通信
  16. android出现多个闹钟图标,无法解除/隐藏Android 5.0 Lollipop上的闹钟图标
  17. WPF CS0234命名空间 *.*中不存在类型或命名空间名“Windows“(是否缺少程序集引用?)
  18. 论文解读:Correcting Chinese Spelling Errors with Phonetic Pre-training
  19. 微信H5支付、非微信H5支付、公众号支付、小程序支付
  20. api-ms-win-core-path-l1-1-0.dll丢失?

热门文章

  1. 基于Python接口自动化测试框架(初级篇)附源码
  2. 零起点英语_零起点英语口语
  3. [NOI1999]生日蛋糕 洛谷P1731
  4. 最新条码标签软件 BarTender 2022 R1
  5. 大型电商网站架构分析
  6. 基于STM32单片机的直流电机PWM调速(Proteus仿真+程序)
  7. Kubeadm 部署企业高可用集群(生产架构)
  8. EtherCAT---帧格式详解
  9. Cloudreve免费开源网盘系统源代码Cloudreve公私兼备网盘系统 多功能仿百度网盘源码+免费分享
  10. k8s学习(二十一) 亲和性调度