`
Poechant
  • 浏览: 229456 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24307
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22095
社区版块
存档分类
最新评论

Practical Netty (1) 基于Netty实现的一个rdate server实例

 
阅读更多

Practical Netty (1) 基于Netty实现的一个rdate server实例


Netty 是一个高效的 Java 网络框架,简单的介绍可参见《Java NIO框架Mina、Netty、Grizzly介绍与对比》一文。对于不熟悉 NIO 的 Java 开发者,Netty 的使用需要一小段的时间来熟悉。当然 Netty 已经更好地封装了 NIO,所以您大可不必先去了解完 NIO,再来了解 Netty。

下面是一个简单的 rdate server 实例,大部分代码参考 Netty Official Examples。什么是 rdate?如果你是 *nix 用户的话,就一定知道:

rdate is a command to set the system's date from a remote host.

具体如下:

rdate displays and sets the local date and time from the host name or
address given as the argument.  The time source may be an RFC 868 TCP
protocol server, which is usually implemented as a built-in service of
inetd(8), or an RFC 2030 protocol SNTP/NTP server.  By default, rdate
uses the RFC 868 TCP protocol.

RdateServer.java

package com.sinosuperman.test.netty;

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;

public class RdateServer {
    private static int port = 28080;

    public static void main(String[] args) {

        // ChannelFactory is a factory which creates and manages Channels and
        // its related resources. 
        ChannelFactory factory =
                new NioServerSocketChannelFactory(
                        Executors.newCachedThreadPool(),  // boss executor
                        Executors.newCachedThreadPool()); // worker executor

        // ServerBootstrap is a helper class that sets up a server. You can set
        // up the server using a Channel directly. However, please note that
        // this is a tedious process and you do not need to do that in most
        // cases.
        ServerBootstrap bootstrap = new ServerBootstrap(factory);

        bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
            @Override
            public ChannelPipeline getPipeline() throws Exception {
                return Channels.pipeline(new RdateServerHandler());
            }
        });

        bootstrap.setOption("child.tcpNoDelay", true);
        bootstrap.setOption("child.keepAlive", true);

        bootstrap.bind(new InetSocketAddress(port));
    }
}

RdateServerHandler.java

下面比较有意思的就是和 NIO 中的 ByteBuffer 类似的 ChannelBuffer,很好用。ChannelFuture 也是 Netty 中经常使用到的。

package com.sinosuperman.test.netty;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.SimpleChannelHandler;

public class RdateServerHandler extends SimpleChannelHandler {
    @Override
    public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
            throws Exception {
        Channel ch = e.getChannel();

        // To send a new message, we need to allocate a new buffer which will
        // contain the message. We are going to write a 32-bit integer, and
        // therefore we need a ChannelBuffer whose capacity is 4 bytes. The
        // ChannelBuffers helper class is used to allocate a new buffer. Besides
        // the buffer method, ChannelBuffers provides a lot of useful methods
        // related to the ChannelBuffer. For more information, please refer to
        // the API reference.
        ChannelBuffer time = ChannelBuffers.buffer(4);
        time.writeInt((int) (System.currentTimeMillis() / 1000L + 2208988800L));

        ChannelFuture f = ch.write(time);

        f.addListener(ChannelFutureListener.CLOSE);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
            throws Exception {
        e.getCause().printStackTrace();
        Channel ch = e.getChannel();
        ch.close();
    }
}

这里比较重要的是时间的计算公式:

System.currentTimeMillis() / 1000L + 2208988800L

具体不细说了,算是一个小常识吧。

客户端测试

客户端就是 Linux 提供的 rdate 命令,如下方式测试:

$ rdate -o <rdate_server_port> -p <rdate_server_ip>

这里默认使用的是 28080。

$rdate -o 28080 -p 127.0.0.1
Fri Dec 28 14:21:05 CST 2012

-

转载请注明来自钟超(Poechant)的 CSDN 博客:http://blog.csdn.net/poechant,作者微博:http://weibo.com/lauginhom

-

分享到:
评论

相关推荐

    Java采用Netty实现基于DTU的TCP服务器 + 多端口 + 多协议

    本文将深入探讨如何使用Java的Netty框架实现一个基于DTU(Data Transfer Unit)的TCP服务器,该服务器具备多端口通信和多协议解析的能力。 首先,DTU是一种专门用于远程数据传输的设备,它能够通过GPRS、3G/4G等...

    一款基于Netty+Zookeeper+Spring实现的轻量级Java RPC框架。提供服务注册,发现,负载均衡,.zip

    标题中的“一款基于Netty+Zookeeper+Spring实现的轻量级Java RPC框架”揭示了这个项目的核心技术栈,它整合了三个在分布式系统中广泛使用的开源库:Netty、Zookeeper和Spring。让我们逐一深入探讨这三个技术以及它们...

    基于 Java Netty实现的可用于内网穿透的代理工具.zip

    基于 Java Netty实现的可用于内网穿透的代理工具.zip基于 Java Netty实现的可用于内网穿透的代理工具.zip基于 Java Netty实现的可用于内网穿透的代理工具.zip基于 Java Netty实现的可用于内网穿透的代理工具.zip基于...

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

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

    基于Netty实现的文件上传

    Netty作为一个高性能、异步事件驱动的网络应用程序框架,被广泛应用于Java领域。本篇将深入探讨如何利用Netty实现文件上传功能,并结合Socket通信和UDP协议进行相关知识的扩展。 首先,我们来关注"基于Netty实现的...

    基于netty实现的web框架

    【描述】:“一个基于Netty实现的Web框架,或者是MVC框架,实现了基于Netty的Web框架,展示了Netty的卓越性能。如果文中存在错误或不足,欢迎资深开发者提供指正。” Netty的强项在于它的非阻塞I/O模型,这种模型...

    rtmpServer-master_nettyrtmp_rtmp推流_netty开发rtmp_rtmpServer-master

    本项目“rtmpServer-master_nettyrtmp_rtmp推流_netty开发rtmp_rtmpServer-master”是针对RTMP协议开发的一个服务器端实现,它基于强大的Java网络库Netty。以下将详细介绍该服务器的开发背景、功能、核心技术和应用...

    NettySocket同步数据获取实现

    在Netty中,我们创建一个ServerBootstrap实例来配置服务器,并设置一个处理器Pipeline,用于处理进来的连接和消息。然后,我们调用bind方法启动服务器并等待客户端连接。当接收到客户端消息时,我们可以在...

    netty案例,netty4.1中级拓展篇十三《Netty基于SSL实现信息传输过程中双向加密验证》源码

    netty案例,netty4.1中级拓展篇十三《Netty基于SSL实现信息传输过程中双向加密验证》源码 ...

    利用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 ...

    springboot+netty 实现简单的一对一聊天

    通过以上步骤,我们可以构建一个基于Spring Boot和Netty的一对一聊天应用。值得注意的是,这只是一个基础实现,实际应用中可能需要考虑更多功能,如群聊、消息历史、文件传输、实时位置共享等,以及更多的安全性和...

    netty-demo实例

    也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,...

    netty实现的聊天代码

    总的来说,这个 Netty 聊天应用 demo 展示了如何利用 Netty 的强大功能,用 Java 实现一个简单的聊天服务器和客户端。通过阅读和学习这个代码,你可以掌握 Netty 的基本架构,包括服务器和客户端的创建、事件驱动...

    基于Netty实现了dubbo rpc

    在基于Netty的实现中,服务提供者会启动一个Netty Server,监听特定端口,接收来自服务消费者的请求。服务消费者则通过Netty Client发送RPC请求到服务提供者。 1. **服务序列化与反序列化**:Dubbo支持多种序列化...

    基于Netty实现的命令行斗地主游戏,为划水摸鱼而生.zip

    基于Netty实现的命令行斗地主游戏,为划水摸鱼而生~ 基于Netty实现的命令行斗地主游戏,为划水摸鱼而生~ 基于Netty实现的命令行斗地主游戏,为划水摸鱼而生~ 基于Netty实现的命令行斗地主游戏,为划水摸鱼而生...

    Spring+Netty+WebSocket实例

    在现代Web开发中,实时通信已经成为一个不可或缺的功能,Spring、Netty和WebSocket的结合为构建高性能、低延迟的实时应用提供了强大的解决方案。本实例将详细探讨如何利用这三种技术进行集成,实现高效的双向通信。 ...

    基于Java开发的一款基于Netty的内网穿透工具,主要用于将内网服务反向代理到公网访问.zip

    标题中的“基于Java开发的一款基于Netty的内网穿透工具”揭示了我们正在讨论的是一个使用Java编程语言,并且依赖于Netty框架的软件应用。Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于开发服务器和...

    基于springboot+netty+redis+hdfs实现的一个线上分布式网盘系统,毕业设计项目,个人学习,课设等均可

    基于springboot+netty+redis+hdfs实现的一个线上分布式网盘系统,毕业设计项目,个人学习,课设等均可,项目经过测试,可完美运行! 项目结构 项目主要分为一下几个模块 web-service 主要功能是页面展示,交互 ...

    netty简单实例

    通过以上步骤,我们可以构建出一个基于 Netty 的简单聊天应用。这只是一个入门级的实例,实际应用中,Netty 可以处理更复杂的网络通信需求,如WebSocket、HTTP 协议等。不断学习和实践,你将能掌握更多关于 Netty 的...

    基于netty编写的socket服务端

    在基于Netty编写的socket服务端中,首先需要定义一个`ChannelHandler`,这个处理器负责处理接收到的网络事件,如连接建立、数据读取、连接关闭等。`ChannelHandlerContext`则是`ChannelHandler`和`ChannelPipeline`...

Global site tag (gtag.js) - Google Analytics