`
sunxboy
  • 浏览: 2878583 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

A simple Tcp Client/Server using Reactor

 
阅读更多

"Reactor is a foundation for asynchronous applications on the JVM. It provides abstractions for Java, Groovy and other JVM languages to make building event and data-driven applications easier. It’s also really fast. On modest hardware, it's possible to process around 15,000,000 events per second with the fastest non-blockingDispatcher. Other dispatchers are available to provide the developer with a range of choices from thread-pool style, long-running task execution to non-blocking, high-volume task dispatching."

Since the first milestone of the project, an easy-to-use TCP client and server are included. Powered by Netty, a Reactor-powered syslog server can ingest something like 1 million messages per sec on server-grade hardware. Reactor TCP support includes a simple Codec facility, which is easily extensible beyond the default set of codecs provided in core and designed to be lightweight by using Reactor's Buffer class, which provides things like extremely efficient views over data, as well as a slew of helper methods for working with standard Java NIO ByteBuffers–but without the pain of dealing with the ByteBuffer directly.Reactor's TCP support comes with JSON right out of the box. 

So, ok, let's have a look!

import java.util.Date;

import org.junit.Test;

import reactor.core.Environment;
import reactor.function.Consumer;
import reactor.tcp.TcpClient;
import reactor.tcp.TcpConnection;
import reactor.tcp.TcpServer;
import reactor.tcp.encoding.json.JsonCodec;
import reactor.tcp.netty.NettyTcpClient;
import reactor.tcp.netty.NettyTcpServer;
import reactor.tcp.spec.TcpClientSpec;
import reactor.tcp.spec.TcpServerSpec;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Main {

  public static class SimpleMessage {

   private String content;

   private Date date;

   @JsonCreator
  public SimpleMessage(@JsonProperty("content") String content,
    @JsonProperty("date") Date date) {
   super();
   this.content = content;
   this.date = date;
  }

   public Date getDate() {
   return date;
  }

   public String getContent() {
   return content;
  }

   @Override
  public String toString() {
   return "SimpleMessage [content=" + content + ", date=" + date + "]";
  }

  }

  @Test
 public void request() throws InterruptedException {

   // Create Environment in which Reactors operate
  Environment env = new Environment();

   TcpServer<SimpleMessage, String> server = new TcpServerSpec<SimpleMessage, String>(
    NettyTcpServer.class)
    .env(env)
    .dispatcher(Environment.RING_BUFFER)
    .listen("localhost", 15151)
    .codec(new JsonCodec<SimpleMessage, String>(SimpleMessage.class))
    .consume(new Consumer<TcpConnection<SimpleMessage, String>>() {

      public void accept(
       TcpConnection<SimpleMessage, String> connection) {
      connection.in().consume(new Consumer<SimpleMessage>() {
       public void accept(SimpleMessage data) {
        System.err.println("Receiving a data! -> "
          + data);
       }
      });
     }
    }).get().start();

   TcpClient<String, SimpleMessage> client = new TcpClientSpec<String, SimpleMessage>(
    NettyTcpClient.class).env(env)
    .dispatcher(Environment.RING_BUFFER)
    .connect("localhost", 15151)
    .codec(new JsonCodec<String, SimpleMessage>(String.class))
    .get();

   final SimpleMessage message = new SimpleMessage("A simple message",
    new Date());

   TcpConnection<String, SimpleMessage> tcpConnection = client.open()
    .await();

   tcpConnection.send(message, new Consumer<Boolean>() {

    public void accept(Boolean data) {
    System.err.println("'" + message + "' sended");
   }
  });

   Thread.sleep(1000);
  tcpConnection.close();

   System.err.println("All data have been send");

   client.close().await();
  server.shutdown().await();
 }

}

 Don't forget the Maven deps:

 <dependency>
   <groupId>org.projectreactor</groupId>
   <artifactId>reactor-core</artifactId>
   <version>1.0.0.M1</version>
  </dependency>
  <dependency>
   <groupId>org.projectreactor</groupId>
   <artifactId>reactor-tcp</artifactId>
   <version>1.0.0.M1</version>
  </dependency>

 

 

分享到:
评论

相关推荐

    reactor-netty, TCP/HTTP/UDP 客户机/服务器,带有联网的反应器.zip

    reactor-netty, TCP/HTTP/UDP 客户机/服务器,带有联网的反应器 反应器联网 http://projectreactor.io/docs/netty/release/api/在软件许可证 2.0许可,,,。

    .NET Reactor 4.9 破解版

    .NET Reactor是一款功能强大的代码保护以及许可授权管理系统软件,主要用于开发人员保护其.NET软件程序,.NET Reactor支持所有支持.NET编译的程序开发语言。 .NET Reactor 4.9是目前最新版本,由大神yoza破解,亲测...

    xzone reactor lol外国插件

    《关于“xzone reactor lol外国插件”的技术解析与安全考量》 在电子竞技领域,尤其是备受瞩目的游戏《英雄联盟》(League of Legends,简称LoL)中,玩家经常寻求各种方式提升游戏体验和竞技水平。其中,“xzone ...

    高性能Server-Reactor模型.pdf

    C/S架构的基本模型是客户端(Client)通过网络向服务器(Server)发送请求,服务器处理请求并返回响应。随着网络速度的提升,尤其是无线网络的普及,C/S架构得以广泛应用,因为它允许用户在任何有网络的地方访问相同...

    Mops/Sweep Particle Reactor Solver-开源

    《Mops/Sweep Particle Reactor Solver:开源粒子反应器求解器详解》 Mops/Sweep Particle Reactor Solver是一款由剑桥大学化学工程系CoMo组研发的开源软件,专门用于模拟和研究粒子群体的动态行为,特别是针对反应...

    Easy-Reactor是一个Linux C++高性能TCP服务框架,基于Reactor模式,支持单线程、多线程Reactor

    Easy-Reactor是一个Linux C++高性能TCP服务框架,基于Reactor模式,支持单线程、多线程Reactor,也支持UDP服务 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始...

    react-netty:带有Reactor over Netty的TCPHTTPUDP客户端服务器

    React堆净值 Reactor Netty提供了基于Netty框架的非阻塞且可支持背压的TCP / HTTP / UDP客户端和服务器。在做了Reactor Netty需要Java 8或+才能运行。 使用来自或Maven Central存储库的Gradle (仅稳定版本): ...

    封装好的TCP/IP类

    此外,对于大规模并发的服务器,可能需要考虑使用更高效的模型,如异步I/O或者复用套接字(Reactor模式)。 总之,这个封装好的C# TCP/IP类提供了一个便捷的途径来实现网络通信,通过隐藏底层的复杂性,使得开发者...

    Eziriz.Net.Reactor.v4.9.0.0(破解)

    Software name : .Net.Reactor Version : 4.9.0.0 Last Update : 5 June 2014 - 7:18 AM OS : WinALL Developers : Eziriz Web-site : http://www.eziriz.com/ Change Logs : See "NET Reactor Changelogs.txt" MD5...

    ACE_server.rar_ACE server_ACE tcp_ACE_SERVER_ACE框架_ace server cl

    在这个“ACE_server”项目中,"server"目录很可能是服务器端的源代码,而"client"目录则包含了客户端的实现。通常,服务器端会监听一个特定的端口,等待客户端的连接请求。当客户端连接到服务器后,它们可以通过TCP...

    reactor-go:React流的 golang 实现

    go get -u github.com/jjeffcaii/reactor-go 例子 注意: 大多数操作我们只能使用func(interface{})interface{} ,因为Golang没有泛型。 :loudly_crying_face: 如果您有更好的想法,请告诉我。 :grinning_face: 单核...

    reactor-core-3.4.14-API文档-中文版.zip

    赠送jar包:reactor-core-3.4.14.jar; 赠送原API文档:reactor-core-3.4.14-javadoc.jar; 赠送源代码:reactor-core-3.4.14-sources.jar; 赠送Maven依赖信息文件:reactor-core-3.4.14.pom; 包含翻译后的API文档...

    Easy-Reactor是一个Linux C++高性能TCP服务框架.zip

    《Easy-Reactor:Linux C++高性能TCP服务框架详解》 在IT行业中,网络编程是不可或缺的一部分,尤其是在服务器端开发中。Easy-Reactor是一款基于Linux环境的C++高性能TCP服务框架,它采用Reactor模式,旨在简化多...

    Easy-Reactor是一个Linux C++高性能TCP服务框架,基于Reactor模式,支持单线程、多线程.zip

    【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 ... 【项目质量】: 所有源码都经过严格测试,...

    异步应用基础库Reactor.zip

    Reactor 是一个基于 JVM 之上的异步应用基础库。为 Java 、Groovy 和其他 JVM 语言提供了构建基于事件和数据驱动应用的抽象库。Reactor 性能相当高,在最新的硬件平台上,使用无堵塞分发器每秒钟可处理 1500 万事件...

    Easy-Reactor是一个基于Reactor模式的Linux C++网络服务器框架

    Easy-Reactor是一个基于Reactor模式的Linux C++网络服务器框架,支持多线程TCP服务器,单线程TCP服务器,单线程UDP服务器等形式,可以让使用者完全专注于业务,快速开发出一个高效的服务器应用。 在工作中开发基础...

    高性能Server---Reactor模型 _ 思考,执行,表达

    它是Client(客户端)与Server(服务器)交互模式的一种,广泛应用于邮件、视频、文档编辑、网页浏览等日常软件中。C/S架构的核心优势在于它能够允许用户在任何有网络的地方进行相同的操作,提高了工作效率和便利性...

    聊聊 Netty 那些事儿之 Reactor 在 Netty 中的实现(创建篇).doc

    public final class EchoServer { static final int PORT = Integer.parseInt(System.getProperty("port", "8007")); public static void main(String[] args) throws Exception { EventLoopGroup bossGroup = ...

    Reactor 3中文帮助文档

    在React框架中,Reactor是其核心库之一,专门用于构建响应式应用程序。本篇文章将详细解读Reactor 3的中文帮助文档,帮助用户理解非阻塞响应式框架的使用方法及其原理,尤其是Spring WebFlux底层实现的相关知识。 ...

Global site tag (gtag.js) - Google Analytics