Android 使用netty框架实现socket通信
16lz
2021-01-23
1.建立socket连接
public class CmdClient {private ClientBootstrap bootstrap;private ChannelFuture channelFuture;private Channel channel;private static final CmdClient client = new CmdClient(); //单例实现,用来取channelprivate CmdClient(){}public static CmdClient getInstance(){return client;}public Channel getChannel() {return channel;} public void setChannel(Channel channel) {this.channel = channel;} public ClientBootstrap getBootstrap() {return bootstrap;} public void setBootstrap(ClientBootstrap bootstrap) {this.bootstrap = bootstrap;} public ChannelFuture getChannelFuture() {return channelFuture;} public void setChannelFuture(ChannelFuture channelFuture) {this.channelFuture = channelFuture;} public int start(String ip,int port) {System.setProperty("java.net.preferIPv4Stack", "true");System.setProperty("java.net.preferIPv6Addresses", "false");bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool()));bootstrap.setPipelineFactory(new CmdPipelineFactory());bootstrap.setOption("tcpNoDelay", true);bootstrap.setOption("keepAlive", true);channelFuture = bootstrap.connect(new InetSocketAddress(ip, port));channelFuture.awaitUninterruptibly();channel = channelFuture.awaitUninterruptibly().getChannel();return 1;} public void stop() {channelFuture.awaitUninterruptibly();if (!channelFuture.isSuccess()) {channelFuture.getCause().printStackTrace();}channelFuture.getChannel().getCloseFuture().awaitUninterruptibly();bootstrap.releaseExternalResources();}
2.CmdPipelineFactory:
public class CmdPipelineFactory implements ChannelPipelineFactory {@Overridepublic ChannelPipeline getPipeline() throws Exception {ChannelPipeline pipeline = Channels.pipeline();pipeline.addLast("cmdDecoder", new CmdDecoder());pipeline.addLast("handler", new CmdClientHandler());return pipeline;}}
3.引入CmdDecoder用来解析协议
public class CmdDecoder extends FrameDecoder {@Overrideprotected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { if (buffer.readableBytes() < 1) { return null; } buffer.markReaderIndex(); ChannelBuffer magicBuff = buffer.readBytes(1); int magic = DataConvert.byteArrayToSignedInt(magicBuff .array()); if (magic == 0x77) { if (buffer.readableBytes() < 19) { return null; } buffer.markReaderIndex(); ChannelBuffer lenBuff = buffer.readBytes(19); PacketParse parse = new PacketParse(null); byte[] lenByte = parse.getPackForTwoByte(lenBuff.array(), 17, 2); int len = DataConvert.byteArrayToSignedInt(lenByte); if (buffer.readableBytes() < len) { buffer.resetReaderIndex(); return null; } ChannelBuffer frame = buffer.readBytes(len); return frame; } buffer.clear(); return null;}
更多相关文章
- android WebSocketClient和TCP协议Socket
- Android使用http协议与服务器通信
- android sip协议通话实现
- 转: Android基于HLS和RTMP协议的第三方SDK选择
- Android之网络请求1————HTTP协议
- android + PHP 实现消息推送(采用MQTT协议)
- android:注册时的协议---》方法一:弹出框
- Android与服务器端数据交互(基于SOAP协议整合android+webservice)
- android 客户端 smtp 协议发送数据