Java NIO实例UDP发送接收数据代码分享
Java的NIO包中,有一个专门用于发送UDP数据包的类:DatagramChannel,UDP是一种无连接的网络协议,
一般用于发送一些准确度要求不太高的数据等。
完整的服务端程序如下:
publicclassStatisticsServer{
//每次发送接收的数据包大小
privatefinalintMAX_BUFF_SIZE=1024*10;
//服务端监听端口,客户端也通过该端口发送数据
privateintport;
privateDatagramChannelchannel;
privateSelectorselector;
privateScheduledExecutorServicees=Executors.newScheduledThreadPool(1);
publicvoidinit()throwsIOException{
//创建通道和选择器
selector=Selector.open();
channel=DatagramChannel.open();
//设置为非阻塞模式
channel.configureBlocking(false);
channel.socket().bind(newInetSocketAddress(port));
//将通道注册至selector,监听只读消息(此时服务端只能读数据,无法写数据)
channel.register(selector,SelectionKey.OP_READ);
//使用线程的方式,保证服务端持续等待接收客户端数据
es.scheduleWithFixedDelay(newRunnable(){
@Override
publicvoidrun(){
try{
while(selector.select()>0){
Iteratoriterator=selector.selectedKeys().iterator();
while(iterator.hasNext()){
SelectionKeykey=iterator.next();
try{
iterator.remove();
if(key.isReadable()){
//接收数据
doReceive(key);
}
}catch(Exceptione){
logger.error("SelectionKeyreceiveexception",e);
try{
if(key!=null){
key.cancel();
key.channel().close();
}
}catch(ClosedChannelExceptioncex){
logger.error("Closechannelexception",cex);
}
}
}
}
}catch(IOExceptione){
logger.error("selector.selectexception",e);
}
}
},0L,2L,TimeUnit.MINUTES);
}
//处理接收到的数据
privatevoiddoReceive(SelectionKeykey)throwsIOException{
Stringcontent="";
DatagramChannelsc=(DatagramChannel)key.channel();
ByteBufferbuffer=ByteBuffer.allocate(MAX_BUFF_SIZE);
buffer.clear();
sc.receive(buffer);
buffer.flip();
while(buffer.hasRemaining()){
byte[]buf=newbyte[buffer.limit()];
buffer.get(buf);
content+=newString(buf);
}
buffer.clear();
logger.debug("receivecontent="+content);
if(StringUtils.isNotBlank(content)){
doSave(content);
}
}
}
客户端发送完整例子如下:
DatagramChannelchannel=DatagramChannel.open();
StringBuildersb=newStringBuilder();
sb.append("2017-03-0912:30:00;")
.append("aaa")
.append("testapp;")
.append("test.do;")
.append("param=hello;")
.append("test;")
.append("100;")
.append("1");
ByteBufferbuffer=ByteBuffer.allocate(10240);
buffer.clear();
buffer.put(sb.toString().getBytes());
buffer.flip();
//此处IP为服务端IP地址,端口和服务端的端口一致
intn=channel.send(buffer,newInetSocketAddress("127.0.0.1",8080));
System.out.println(n);
//每次数据发送完毕之后,一定要调用close方法,来关闭占用的udp端口,否则程序不结束,端口不会释放
channel.close();
总结
以上就是本文关于JavaNIO实例UDP发送接收数据代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:
Rxjava功能操作符的使用方法详解
分享一个简单的java爬虫框架
Javaweb应用使用限流处理大量的并发请求详解
有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!