java udp nio_Java NIO UDP DEMO
今天有人问我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相关推荐
- java udp nio_Java NIO系列教程(十) Java NIO DatagramChannel
原文链接 作者:Jakob Jenkov 译者:郑玉婷 校对:丁一 Java NIO中的DatagramChannel是一个能收发UDP包的通道.因为UDP是无连接的网络协议,所以 ...
- java buffer nio_Java NIO之Buffer(缓冲区)入门
Java NIO中的缓存区(Buffer)用于和通道(Channel)进行交互.数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内 ...
- Java网络编程之UDP和TCP套接字
文章目录 一. 网络编程概述 二. UDP网络编程 1. UDP套接字 2. UDP客户端回显服务器程序 2.1 UDP回显服务器 2.2 UDP客户端 2.3 UDP实现查词典的服务器 三. TCP ...
- Java实例练习——基于UDP协议的多客户端通信
昨天学习了UDP协议通信,然后就想着做一个基于UDP的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区 ...
- Java学习系列(十八)Java面向对象之基于UDP协议的网络通信
UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...
- Java实现简单的UDP编程
Java实现简单的UDP编程 客户端 package com.udp.service;import java.net.DatagramPacket; import java.net.DatagramS ...
- 萌新解--Java网络编程之UDP
Java网络编程之UDP UDP协议为无连接的通信协议,在传数据前发送端与接收端不会先建立连接,也就是你发我就收但不一定会收到哦,以我们自身为发送端,我们不会事先让接收方知道我要给接收方发数据啦.就像 ...
- Java——网络编程(UDP与TCP通信及实现聊天案例)
目录 1.什么是网络通信协议? 2.TCP/IP协议 3.协议分类 3.1.UDP协议 3.2.TCP协议 4.网络编程三大要素 4.1.协议 4.2.IP地址 4.3.端口号 5.InetAddre ...
- 【Java 网络编程】UDP 简介
文章目录 I UDP 简介 II UDP 不可靠性 III UDP 作用 IV UDP 报文头 V UDP 数据包长度 I UDP 简介 1. UDP : User Datagram Protocol ...
最新文章
- 服务器安全防护和保护措施方案—Vecloud
- 软链接与硬链接的区别;描述通配符与正则表达式的区别
- Java 算法 麦森数
- 神了,一次解决Java所有痛难点!
- Java IO实战操作(一)
- MXY-单点登陆系统
- 专利申请“技术交底书”的要素和撰写要求
- html泰勒展开,【转载】泰勒展开式
- 群发邮件平台你知道那个好吗,一款邮件群发100万封群发邮件平台
- 三进制 四进制计算机原理,基因编码为何选择了“四进制”,而不是计算机系统的“二进制”?...
- Problem A: 算法4-5:求子串位置的定位函数
- IT十年人生过客-二十五-双十一
- 高级操作!用 Python 在 Excel 里画出蒙娜丽莎
- Matlab从txt第二行开始读,MATLAB小技:从文本数据第n行开始读取
- 51单片机之串口通信
- android出现多个闹钟图标,无法解除/隐藏Android 5.0 Lollipop上的闹钟图标
- WPF CS0234命名空间 *.*中不存在类型或命名空间名“Windows“(是否缺少程序集引用?)
- 论文解读:Correcting Chinese Spelling Errors with Phonetic Pre-training
- 微信H5支付、非微信H5支付、公众号支付、小程序支付
- api-ms-win-core-path-l1-1-0.dll丢失?