`
guoc
  • 浏览: 29998 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个简单 netty client pojo通讯实现

阅读更多

------------------------------------

1

------------------------------------

package admin.netty;

import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;

public class TimeClientHandler extends SimpleChannelHandler { 
 
    private String returnFlag = null;
   
    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
        CtrlProtocol m = (CtrlProtocol) e.getMessage();
        this.returnFlag = m.getFlag();
        //System.out.println(returnFlag);
        e.getChannel().close();
    }
 
    @Override 
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {  
        e.getCause().printStackTrace();  
        e.getChannel().close();  
    }      
     
    public ChannelFuture process(Channel channel,CtrlProtocol requestParameter) {
        return channel.write(requestParameter);
    }
   
    public String getReturnFlag(){
        return this.returnFlag;
    }
}

------------------------------- 

2

-------------------------------

package admin.netty;

import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;

public class TimeClientPipelineFactory implements ChannelPipelineFactory {

    public ChannelPipeline getPipeline() {
        ChannelPipeline pipeline = Channels.pipeline();
        pipeline.addLast("decoder", new CtrlProtocolDecoder());
        pipeline.addLast("encoder", new CtrlProtocolEncoder());       
        pipeline.addLast("handler", new TimeClientHandler());
        return pipeline;
    }
}

------------------------------- 

3

-------------------------------

package admin.netty;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.frame.FrameDecoder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class CtrlProtocolDecoder extends FrameDecoder {

    private static final Log    ilog    = LogFactory.getLog(CtrlProtocolDecoder.class);

    /*
     * (non-Javadoc)
     * @see org.jboss.netty.handler.codec.frame.FrameDecoder#decode(org.jboss.netty.channel.ChannelHandlerContext,
     * org.jboss.netty.channel.Channel, org.jboss.netty.buffer.ChannelBuffer)
     */
    @Override
    protected CtrlProtocol decode(ChannelHandlerContext arg0, Channel arg1, ChannelBuffer arg2) throws Exception {

        ChannelBuffer buf = arg2;

        if (buf.readableBytes() < 8) {
            ilog.error("收到的协议数据不完整,无法解析协议头.");           
            return null;
        }

        short head_flag = buf.readShort();
        short head_code = buf.readShort();
        int head_length = buf.readInt();

        CtrlProtocol protocol = new CtrlProtocol(head_flag, head_code, head_length);
       
        ilog.info("收到的协议:" + head_flag + "    " + head_code + "    " + head_length + "\n");

        return protocol;
    }
}

------------------------------- 

4

-------------------------------

package admin.netty;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;

public class CtrlProtocolEncoder extends OneToOneEncoder {

    /*
     * (non-Javadoc)
     * @see org.jboss.netty.handler.codec.oneone.OneToOneEncoder#encode(org.jboss.netty.channel.ChannelHandlerContext,
     * org.jboss.netty.channel.Channel, java.lang.Object)
     */
    @Override
    protected Object encode(ChannelHandlerContext arg0, Channel arg1, Object arg2) throws Exception {
        CtrlProtocol protocol = (CtrlProtocol) arg2;

        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();

        buf.writeShort((short) protocol.getFlag());
        buf.writeShort((short) protocol.getCode());
        buf.writeInt(protocol.getLength());
/*略去*/
        return buf;
    }
}

------------------------------- 

5

-------------------------------

package admin.netty;

public class CtrlProtocol {

    private short            flag        = 0;
    private short            code        = 0;
    private int            length        = 0;

    public CtrlProtocol(short f, short c, int l) {
        flag = f;
        code = c;
        length = l;
    }
   
    public static CtrlProtocol getCtrlInstance() {
        return new CtrlProtocol((short) 1, (short) 1, (short) 1);
    }

    public short getFlag() {

        return flag;
    }

    public void setFlag(short flag) {

        this.flag = flag;
    }

    public short getCode() {

        return code;
    }

    public void setCode(short code) {

        this.code = code;
    }

    public int getLength() {

        return length;
    }

    public void setLength(int length) {

        this.length = length;
    }
  /* 略去*/
}

------------------------------- 

6 客户端执行异步发送接收(服务端返回数据与客户端发送数据结构一致)

-------------------------------

import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;

....

            CtrlProtocol cp = CtrlProtocol.getCtrlInstance();
....

            String flag = this.toDo (cp);

///////////////////////////////////////////////

    //Socket异步发送接收通讯协议
    //参数:CtrlProtocol 协议

private String toDo (CtrlProtocol cp) throws Exception{
        String flag = "0";//结果
        String host ="127.0.0.1";

        int port = 7788;


        ChannelFactory factory = new NioClientSocketChannelFactory(
                Executors.newCachedThreadPool(),
                Executors.newCachedThreadPool());

        ClientBootstrap bootstrap = new ClientBootstrap(factory);

        bootstrap.setPipelineFactory(new TimeClientPipelineFactory());

        bootstrap.setOption("tcpNoDelay", true);
        bootstrap.setOption("keepAlive", true);
       
        ChannelFuture future = bootstrap.connect(new InetSocketAddress(
                host, port));
        Channel channel = future.awaitUninterruptibly().getChannel();
        TimeClientHandler handler = channel.getPipeline().get(TimeClientHandler.class);
               
        handler.process(channel, cp);       
       
        future.awaitUninterruptibly();
        if (!future.isSuccess()) {
            future.getCause().printStackTrace();
        }       
       
        future.getChannel().getCloseFuture().awaitUninterruptibly();
        factory.releaseExternalResources();
        flag = handler.getReturnFlag();
               
        return flag;
    }

 

 

 

分享到:
评论

相关推荐

    基于Netty实现的MQTT客户端_netty-mqtt-client.zip

    基于Netty实现的MQTT客户端_netty-mqtt-client

    netty及时通讯通讯DEMO

    通过这个DEMO,开发者可以学习到如何使用Netty搭建一个即时通讯服务,理解其内部工作原理,并根据实际需求进行定制化开发。在实际应用中,还需要考虑安全性、容错性、可扩展性等多个方面,不断优化和完善。

    利用netty实现Modbus TCP client/server

    利用netty实现Modbus TCP client/server READ COILS | 0x01 READ DISCRETE INPUTS | 0x02 READ HOLDING REGISTERS | 0x03 READ INPUT REGISTERS | 0x04 WRITE SINGLE COIL | 0x05 WRITE SINGLE REGISTER | 0x06 ...

    netty pojo 文档

    netty pojo netty pojo替换 channelbuffer

    Netty4.0学习笔记系列之一:Server与Client的通讯

    在Netty中,数据的传输是通过`ByteBuf`实现的,这是一个高效且灵活的字节缓冲区,可以避免不必要的内存复制。`ByteBuf`提供了读写指针管理,方便我们处理不同格式的数据。 此外,Netty还提供了许多内置的协议支持,...

    基于java GUI界面的简易netty聊天室(实现群聊和私聊)

    这个项目旨在为用户提供一个简单易用的聊天平台,用户可以通过图形化界面进行实时通信。下面将详细阐述这个聊天室的关键技术点。 【Netty】Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护...

    netty 实现长连接

    标签中的“源码”可能暗示文章会涉及到Netty的内部实现细节,而“工具”可能是指Netty作为一个用于构建网络应用的工具。文件名称“boce_web”可能与博客所在的平台或者某种特定的Web服务有关,但没有更多信息可供...

    java应用netty服务端和客户端

    在"java应用netty服务端和客户端"的示例中,Netty被用来构建一个简单的通信系统,其中包含服务端(Server)和客户端(Client)。为了实现通信,服务端和客户端都需要定义自己的`model对象`,这些对象通常包含了数据...

    整合netty实时通讯

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨 Netty 实时通讯的原理与应用,以及如何利用它构建 WebSocket 服务。 WebSocket 是...

    netty http client & server

    而在 "netty-http-client" 文件中,包含了一个简单的 HTTP 客户端示例,演示了如何向服务器发送请求并接收响应。 总的来说,Netty 提供了强大而灵活的工具来构建 HTTP 客户端和服务器,无论是对于学习网络编程,...

    物联网通讯协议,基于netty框架,支持COM(串口)和TCP协议,同时支持设备组多台设备高并发通讯

    物联网通讯协议,基于netty框架,支持COM(串口)和TCP协议,同时支持设备组多台设备高并发通讯。设计上采用工厂设计模式,代码采用继承和重写的方式实现高度封装,可作为SDK提供封装的接口,让具体的业务开发人员...

    C# Netty 客户端,服务器端包含接双向接收

    标题中的"C# Netty 客户端,服务器端包含双向接收"揭示了这是一个关于使用C#语言实现基于Netty框架的客户端和服务器端通信的项目。Netty是Java平台上的一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可...

    Netty即时通讯项目Demo

    Netty即时通讯项目Demo是一个基于Netty框架的简单即时通讯应用示例,旨在帮助初学者了解如何利用Netty实现一个基础的群聊功能。Netty是Java领域内一个高性能、异步事件驱动的网络应用程序框架,它极大地简化了网络...

    使用netty5进行udp网络通讯

    这个小程序使用netty5进行udp网络通讯,客户端有两种,1:用netty5类库发送DatagramPacket和接收 2:直接使用DatagramSocket发送接收DatagramPacket 先运行netty_server的QuoteOfTheMomentServer, 在运行netty_...

    transport-netty4-client-5.5.1-API文档-中英对照版.zip

    赠送jar包:transport-netty4-client-5.5.1.jar; 赠送原API文档:transport-netty4-client-5.5.1-javadoc.jar; 赠送源代码:transport-netty4-client-5.5.1-sources.jar; 赠送Maven依赖信息文件:transport-netty...

    使用 netty实现一个简单的聊天室

    在这个“使用 Netty 实现一个简单的聊天室”的项目中,我们将深入理解 Netty 的核心概念和组件,以及如何利用它们构建一个实时交互的聊天应用。 1. **Netty 基本概念** - **BossGroup 和 WorkerGroup**:在 Netty ...

    spring boot 整合的netty 实现的socket的服务端和客户端

    在Spring Boot中整合这些组件,我们可以创建一个`@Configuration`类,声明`NettyServer`和`NettyClient`的`Bean`,并利用Spring Boot的自动配置功能。这样,当我们启动应用时,服务器和客户端会自动启动并进行连接。...

    maven-netty-client

    Maven Netty Client 是一个基于Java的高性能网络应用框架,它主要用于构建可伸缩、高并发的网络客户端。Netty 提供了一套强大而灵活的API,使得开发者能够高效地处理TCP、UDP、HTTP、HTTPS等各种协议的网络通信。本...

    transport-netty4-client-6.3.0-API文档-中文版.zip

    赠送jar包:transport-netty4-client-6.3.0.jar; 赠送原API文档:transport-netty4-client-6.3.0-javadoc.jar; 赠送源代码:transport-netty4-client-6.3.0-sources.jar; 赠送Maven依赖信息文件:transport-netty...

    Netty入门与实战:仿写微信IM即时通讯系统

    本文将详细介绍如何利用Netty框架来实现一个简易版的微信即时通讯系统,包括单聊和群聊功能。 #### 二、Netty概述 Netty是一个异步事件驱动的网络应用框架及工具库,用Java编写,能够快速开发高性能、高可靠性的...

Global site tag (gtag.js) - Google Analytics