netty4.x初试,简单的通讯
来源:互联网 发布:ios11.2 软件打不开 编辑:程序博客网 时间:2024/06/16 16:10
一个简单的聊天部分,网络上的一堆东东,有完整的不完整的,留一手的太多,还是自己写一个完整的,留自己用就好了
设计目的:
时间基本的消息为
|消息长度(4个字节)|cmd(short)|消息体|
的消息通讯方式
package com.codec;public class NetMsg { private short cmd; private byte[] data; public NetMsg(){ } public NetMsg(short cmd, byte[] data){ this.cmd = cmd; this.data = data; } public short getCmd() { return cmd; } public void setCmd(short cmd) { this.cmd = cmd; } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; }}package com.codec;import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelHandlerContext;import io.netty.handler.codec.MessageToByteEncoder;public class MsgEncode extends MessageToByteEncoder<NetMsg> { @Override protected void encode(ChannelHandlerContext ctx, NetMsg m, ByteBuf out) throws Exception { int body = 0; if (m.getData() != null){ body = m.getData().length; } int total = 2 + body; out.writeInt(total); out.writeShort(m.getCmd()); if (m.getData() != null){ out.writeBytes(m.getData()); } }}package com.codec;import java.util.List;import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelHandlerContext;import io.netty.handler.codec.ByteToMessageDecoder;public class MsgDecode extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { while(true){ if (in.readableBytes() < 4) return; in.markReaderIndex(); int total = in.readInt(); if (in.readableBytes() < total){ in.resetReaderIndex(); return; } short cmd = in.readShort(); byte[] data = new byte[total - 2]; in.readBytes(data); NetMsg m = new NetMsg(); m.setCmd(cmd); m.setData(data); out.add(m); } }}package com;import com.codec.NetMsg;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;public class ClientHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { NetMsg m = (NetMsg)msg; System.out.println("==============from server==========="); System.out.println(new String(m.getData(), "UTF-8")); super.channelRead(ctx, msg); }}package com;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import com.codec.MsgDecode;import com.codec.MsgEncode;import com.codec.NetMsg;import io.netty.bootstrap.Bootstrap;import io.netty.channel.Channel;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioSocketChannel;public class Client { class ClientInitianlizer extends ChannelInitializer<SocketChannel>{ @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pp = ch.pipeline(); pp.addLast("decoder", new MsgDecode()); pp.addLast("encoder", new MsgEncode()); pp.addLast("handler", new ClientHandler()); } } public void start(String host, int port) throws InterruptedException, IOException{ System.out.println("==========>>start client host:" + host + ":" + port + "============"); EventLoopGroup group = new NioEventLoopGroup(); try{ Bootstrap b = new Bootstrap(); b.group(group); b.channel(NioSocketChannel.class); b.handler(new ClientInitianlizer()); Channel ch = b.connect(host, port).sync().channel(); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); while(true){ String line = in.readLine(); if (line == null){ continue; } if (line.contains("quit")){ break; } NetMsg m = new NetMsg(); m.setCmd((short)100); m.setData(line.getBytes()); ch.writeAndFlush(m); } }finally{ group.shutdownGracefully(); } } public static void main(String[] args) { try { new Client().start("127.0.0.1", 9001); } catch (InterruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}package com;import com.codec.NetMsg;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;public class ServerHandler extends ChannelInboundHandlerAdapter{ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { super.channelActive(ctx); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { super.channelInactive(ctx); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { super.channelRead(ctx, msg); NetMsg m = (NetMsg)msg; System.out.println("==========from client=========="); System.out.println(new String(m.getData(), "UTF-8")); ctx.writeAndFlush(msg); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { super.exceptionCaught(ctx, cause); }}package com;import com.codec.MsgDecode;import com.codec.MsgEncode;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;public class Server { class ServerInitializer extends ChannelInitializer<SocketChannel>{ @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pp = ch.pipeline(); pp.addLast("decoder", new MsgDecode()); pp.addLast("encoder", new MsgEncode()); pp.addLast("handler", new ServerHandler()); } } public void start(int port) throws InterruptedException { System.out.println("===============start server port:" + port + "====================="); EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup); b.channel(NioServerSocketChannel.class); b.childHandler(new ServerInitializer()); ChannelFuture f = b.bind(port).sync(); f.channel().closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } public static void main(String[] args) { try { new Server().start(9001); } catch (InterruptedException e) { e.printStackTrace(); } }}
上面完整的代码,编译测试通过
阅读全文
0 0
- netty4.x初试,简单的通讯
- Netty4.x
- Java NIO框架--Netty4的简单示例
- Java NIO框架--Netty4的简单示例
- Netty4系列--实现简单的Http协议
- swift初试-简单的天气预报
- Netty4.x HelloWorld
- netty4.x入门教程
- Netty4.1.x ChannelHandler
- netty4.x FixedChannelPool使用
- netty4.0.23 简单demo
- 基于Netty4的HttpServer和HttpClient的简单实现
- 基于Netty4的HttpServer和HttpClient的简单实现
- 基于Netty4的HttpServer和HttpClient的简单实现
- 基于Netty4的HttpServer和HttpClient的简单实现
- 基于Netty4的HttpServer和HttpClient的简单实现
- 基于Netty4的HttpServer和HttpClient的简单实现
- 基于Netty4的HttpServer和HttpClient的简单实现
- Thread类的知识整理
- 动态代理与AOP(3)
- 纠结了好久的递归
- win10 eclipse jdk1.7配置Hanlp
- spring boot 集成Async 注解 异步处理
- netty4.x初试,简单的通讯
- Adapter模式
- C/C++调用lua的table,table包含函数,table和变量
- 浏览器访问sp页面出现文件下载的情况
- node
- 怎么在官网上下载java连接mysql的驱动jar包?
- Python翻转字符串(reverse string)详解
- 58
- <C++ Primer_5th>习题_1.9