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

不使用Netty的UDP实例:

UdpServer.java

package com.rainy.netty.udp02;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; /**
* Created by smzdm on 16/8/10.
*/
public class UdpServer { public static final int PORT = 30000;
// 定义每个数据报的最大大小为4KB
private static final int DATA_LEN = 4096;
// 定义接收网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
// 以指定字节数组创建准备接收数据的DatagramPacket对象
private DatagramPacket inPacket =
new DatagramPacket(inBuff, inBuff.length);
// 定义一个用于发送的DatagramPacket对象
private DatagramPacket outPacket;
// 定义一个字符串数组,服务器端发送该数组的元素
String[] books = new String[] {
"疯狂Java讲义",
"轻量级Java EE企业应用实战",
"疯狂Android讲义",
"疯狂Ajax讲义"
}; public void init() throws IOException {
try {
// 创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket(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(new String(inBuff
, 0, inPacket.getLength()));
// 从字符串数组中取出一个元素作为发送数据
byte[] sendData = books[i % 4].getBytes();
// 以指定的字节数组作为发送数据,以刚接收到的DatagramPacket的
// 源SocketAddress作为目标SocketAddress创建DatagramPacket
outPacket = new DatagramPacket(sendData
, sendData.length, inPacket.getSocketAddress());
// 发送数据
socket.send(outPacket);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
} public static void main(String[] args) throws IOException {
new UdpServer().init();
}
}

UdpClient.java

package com.rainy.netty.udp02;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner; /**
* Created by smzdm on 16/8/10.
*/
public class UdpClient { // 定义发送数据报的目的地
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 =
new DatagramPacket(inBuff, inBuff.length);
// 定义一个用于发送的DatagramPacket对象
private DatagramPacket outPacket = null; public void init() throws IOException {
try {
// 创建一个客户端DatagramSocket,使用随机端口
DatagramSocket socket = new DatagramSocket();
// 初始化发送用的DatagramSocket,它包含一个长度为0的字节数组
outPacket = new DatagramPacket(new byte[0], 0
, InetAddress.getByName(DEST_IP), DEST_PORT);
// 创建键盘输入流
Scanner scan = new Scanner(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) throws IOException {
new UdpClient().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<DatagramPacket> { @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

package com.rainy.netty.udp;

import java.net.InetSocketAddress;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
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;
import io.netty.util.CharsetUtil; /**
* Created by smzdm on 16/8/10.
*/
public class NettyUdpClient { public static void main(String[] args) {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group).channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST,true)
.handler(new UdpClientHandler()); Channel ch = b.bind(0).sync().channel();
// 向网段类所有机器广播发UDP
ch.writeAndFlush(
new DatagramPacket(
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<DatagramPacket> {
@Override
public void messageReceived(ChannelHandlerContext channelHandlerContext,
DatagramPacket datagramPacket) throws Exception { String response = datagramPacket.content().toString(CharsetUtil.UTF_8);
if(response.startsWith("结果:")){
System.out.println(response);
channelHandlerContext.close();
}
} @Override
public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause)throws Exception{
ctx.close();
cause.printStackTrace();
}
}

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

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

    packet.sender().getAddress().getHostAddress();
进行获取发送端IP地址,本质上来说,这个UDP一般都是基于使用UDP的方式进行自定义协议方式实现业务功能,具体可以根据自己的文档格式进行对应的解析。这个方式,如果做过银行接口的,应该对这个接口实现方式有一定的认识。 本文暂时先写到这里,如果有什么问题,请留言。大家一起交流讨论NIO方面的问题,一起进步。

Java NIO UDP DEMO的更多相关文章

  1. JAVA NIO udp 实现 群转发

    场景很简单,就是多个客户端通过udp,连接到服务器(其实是无连接的,就是服务器保存了客户端的ip信息).然后通过udp协议先服务器发送消息,然后服务器在通过udp转发在各个客服端. 这个是不是 观察者 ...

  2. JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)

    Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架.它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP.UDP/IP.串口和虚拟机内部的管道等传输方式.A ...

  3. 使用JAVA NIO实现的UDP client和server

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  4. Java NIO网络编程demo

    使用Java NIO进行网络编程,看下服务端的例子 import java.io.IOException; import java.net.InetAddress; import java.net.I ...

  5. 快学Java NIO

    Java NIO Tutorial 地址:http://tutorials.jenkov.com/java-nio/index.html Java NIO系列教程译文地址:http://ifeve.c ...

  6. Java NIO的探究

    1.Java NIO与阻塞IO的区别 阻塞IO通信模型(在上一篇<J2SE网络编程之 TCP与UDP>博客中有所介绍) 我们知道阻塞I/O在调用InputStream.read()方法时是 ...

  7. Java - NIO基础

    1. 概述 现在使用NIO的场景越来越多,很多技术框架都使用NIO技术,比如Tomcat,Jetty,Netty等. 传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer进行操 ...

  8. 史上最强Java NIO入门:担心从入门到放弃的,请读这篇!

    本文原题“<NIO 入门>,作者为“Gregory M. Travis”,他是<JDK 1.4 Tutorial>等书籍的作者. 1.引言 Java NIO是Java 1.4版 ...

  9. java NIO面试题剖析

    转载:https://mp.weixin.qq.com/s/YIcXaH7AWLJbPjnTUwnlyQ 首先我们分别画图来看看,BIO.NIO.AIO,分别是什么? BIO:传统的网络通讯模型,就是 ...

随机推荐

  1. java网络编程serversocket

    转载:http://www.blogjava.net/landon/archive/2013/07/24/401911.html Java网络编程精解笔记3:ServerSocket详解ServerS ...

  2. BZOJ3695 滑行

    转化模型就变成几层折射率不同的玻璃光要怎么走才能从(0, 0)到(x, y) 我们发现第一次光线射出去的角度确定,之后光的行程是确定的 而且角度和最后到达y时的x成正相关,于是可以二分! 然后物理学学 ...

  3. Storm(4) - Distributed Remote Procedure Calls

    Using DRPC to complete the required processing 1. Create a new branch of your source using the follo ...

  4. [转]z-order引出的问题

    在窗口与窗口之间毫无重叠的情况下,根本不需要关心z-order.然而,当窗口之间出现重叠时,系统就需要通过一个标准来确定窗口的显示顺序.这个标准就是z-order.存在多个因素影响一个窗口的z-ord ...

  5. was7 安装遇到问题(Linux平台Redhat 6)

    1../launchpad.sh 无法启动安装,提示无法找到浏览器 解决:直接进入WAS文件夹,执行install cd WAS ./install 2.安装时中文乱码 设置区域为美国: LANG=e ...

  6. 虚拟机的apache服务器不能被主机访问的问题

    我在centos虚拟机上安装了elasticsearch服务,虚拟机里测试正常,但主机却无法访问elasticsearch.要说的是,虚拟机采用桥接模式,与主机相互ping得通. 后来查了资料发现,这 ...

  7. subString用法,字符串保持一定位数,不足补0

    Substrinig(a,b): 从下标a开始截取,共截取b位 实现:一串数字,中间两位数字+2,生成新的一串数字 "; , number.Length - );//前8位 );//后6位 ...

  8. dbcp连接池配置参数

    1.<!-- 数据源1 --> 2. <bean id="dataSource" 3. class="org.apache.commons.dbcp.B ...

  9. 基于K2 BPM的大型连锁企业开关店选址管理解决方案

    业内有句名言:“门店最重要的是什么?第一是选址,第二是选址,第三还是选址” 选址是一个很复杂的综合性商业决策过程,需要定性考虑和定向分析.K2开关店&选址管理方案重点关注:如何开出更好的店?在 ...

  10. vi编辑器选项

    Vi编辑器有一些选项设置可以帮助人们更好的使用. 在vi中选项分为两种: 1.  开关选项,如果要打开这类选项就使用ex命令——:set 选项:如果要关闭这类选项就是用ex命令——:set  no选项 ...