Netty框架基于UDP实战(一):局域网扫描功能的实现
2016-09-29 20:39
489 查看
环境:
服务端:SearchServer.java
客户端:SearchClient.java
配置常量:AppConstants.java
来自:http://blog.csdn.net/hanbin_2015/article/details/50069705
compile 'io.netty:netty-all:4.1.2.Final'
服务端:SearchServer.java
package nettytest.udp; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.DatagramPacket; import io.netty.channel.socket.nio.NioDatagramChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 局域网扫描发现功能的实现,基于netty的udp * Created by Lovell on 9/29/16. */ /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@@@@@@ @@ @@@@@@@ @@ @@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@@@@@@@ @@@@ @@@ @@@@@ @@@ @@@@@@@@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@@@@@@@ @@@@ @@@@ @@@ @@@@ @@@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@@@@@@@ @@@@ @@@@@ @ @@@@@ @@@@@@@@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@ @@@@@@ @@@@@@ @@ @@@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ public class SearchServer { private static Logger logger = LoggerFactory.getLogger(SearchServer.class); /** * udp服务端,接受客户端发送的广播 */ public static void initServer() { try { Bootstrap bootstrap = new Bootstrap(); EventLoopGroup group = new NioEventLoopGroup(); bootstrap.group(group) .channel(NioDatagramChannel.class) .option(ChannelOption.SO_BROADCAST, true) .handler(new UdpServerHandler()); Channel channel = bootstrap.bind(AppConstants.SEARCH_PORT).sync().channel(); channel.closeFuture().await(); } catch (InterruptedException e) { e.printStackTrace(); } } private static class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> { @Override protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { ByteBuf buf = msg.copy().content(); byte[] req = new byte[buf.readableBytes()]; buf.readBytes(req); String body = new String(req, "UTF-8"); logger.info(body);// 打印收到的信息 // 向客户端发送消息 String json = "给客户端发送的内容"; // 由于数据报的数据是以字符数组传的形式存储的,所以传转数据 byte[] bytes = json.getBytes("UTF-8"); DatagramPacket data = new DatagramPacket(Unpooled.copiedBuffer(bytes), msg.sender()); // 向客户端发送消息 ctx.writeAndFlush(data); } } }
客户端:SearchClient.java
package nettytest.udp; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.DatagramPacket; import io.netty.channel.socket.nio.NioDatagramChannel; import io.netty.util.CharsetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetSocketAddress; /** * Created by Lovell on 9/29/16. */ /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@@@@@@ @@ @@@@@@@ @@ @@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@@@@@@@ @@@@ @@@ @@@@@ @@@ @@@@@@@@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@@@@@@@ @@@@ @@@@ @@@ @@@@ @@@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@@@@@@@ @@@@ @@@@@ @ @@@@@ @@@@@@@@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@ @@@@@@ @@@@@@ @@ @@@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ public class SearchClient { private static Logger logger = LoggerFactory.getLogger(SearchClient.class); public static final int MessageReceived = 0x99; private int scanPort; public SearchClient(int scanPort) { this.scanPort = scanPort; } private static class CLientHandler extends SimpleChannelInboundHandler<DatagramPacket> { @Override protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { String body = msg.content().toString(CharsetUtil.UTF_8); //这里接收到服务端发送的内容 logger.info("Search, body ==>" + body); } } public void sendPackage() { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(group) .channel(NioDatagramChannel.class) .option(ChannelOption.SO_BROADCAST, true) .handler(new CLientHandler()); Channel ch = b.bind(0).sync().channel(); ch.writeAndFlush(new DatagramPacket( Unpooled.copiedBuffer("Searh:", CharsetUtil.UTF_8), new InetSocketAddress("255.255.255.255", scanPort))).sync(); logger.info("Search, sendPackage()"); // QuoteOfTheMomentClientHandler will close the DatagramChannel when a // response is received. If the channel is not closed within 5 seconds, // print an error message and quit. // 等待5秒钟 if (!ch.closeFuture().await(5000)) { logger.info("Search request timed out."); } }catch (Exception e){ e.printStackTrace(); logger.info("Search, An Error Occur ==>" + e); } finally { group.shutdownGracefully(); } } }
配置常量:AppConstants.java
package nettytest.udp; /** * Created by Lovell on 9/29/16. */ /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@@@@@@ @@ @@@@@@@ @@ @@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@@@@@@@ @@@@ @@@ @@@@@ @@@ @@@@@@@@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@@@@@@@ @@@@ @@@@ @@@ @@@@ @@@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@@@@@@@ @@@@ @@@@@ @ @@@@@ @@@@@@@@ @@@@@@@@@ @@@@@@@@@@ @@@@ @@ @@@@@@ @@@@@@ @@ @@@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ public interface AppConstants { int SEARCH_PORT = 5566; }
来自:http://blog.csdn.net/hanbin_2015/article/details/50069705
相关文章推荐
- 基于Netty网络通信框架的电子白板,可实现同屏互动功能
- Python+Socket实现基于UDP协议的局域网广播功能示例
- 只需五步,即可基于Netty框架实现Android内网推送功能。
- 基于.NET平台的Windows编程实战(八)— 数据库管理及其他辅助功能的实现
- 基于.NET平台的Windows编程实战(八)— 数据库管理及其他辅助功能的实现
- VB.NET C#实现基于UDP的免服务器局域网多客户端点对点通讯
- Android实战简易教程-第二十四枪(基于Baas的用户表查询功能实现!)
- 基于UDP的局域网聊天实现
- 基于.NET平台的Windows编程实战(六)—— 题目管理功能的实现
- 艾伟:基于.NET平台的Windows编程实战(五)—— 问卷管理功能的实现
- C# 基于插件的开发框架实现Ribbon界面与功能的分离附DEMO
- Winform开发框架之参数配置管理功能实现-基于SettingsProvider.net的构建
- 基于.NET平台的分层架构实战(九)——数据访问层的第三种实现:基于NBear框架的ORM实现
- 基于.NET平台的分层架构实战(九)—数据访问层的第三种实现:基于NBear框架的ORM实现
- 基于.NET平台的分层架构实战(九)——数据访问层的第三种实现:基于NBear框架的ORM实现
- 基于TCP和UDP的聊天功能的实现
- 基于.NET平台的分层架构实战(九)——数据访问层的第三种实现:基于NBear框架的ORM实现
- Android开发之基于MINA框架的聊天通信功能实现
- oc下实现局域网udp广播通讯使用开源框架GCDAsyncUdpSocket
- php CI框架实现验证码功能和增强验证码安全性实战教程