smart-socket是什么

smart-socket是什么

smart-socket文档地址git

http://smartsocket.mydoc.io/?t=260338程序员

码云地址:编程

https://gitee.com/smartboot/smart-socketsession

 

smart(百度翻译:聪明的;敏捷的;漂亮的;整齐的),从为项目起名开始,便对其寄予了厚望。专一于通讯组件的研究与发展,摒弃一切大而全的解决方案,仅提供小而美的基础服务。不管您是从事IOT、IM、RPC,仍是其他通讯领域的开发工做,相信smart-socket都是很是酷的选择。若是要用一句话来为smart-socket打call,那就是:碰见smart-socket,你就已经赢在起跑线了。 输入图片说明框架

关于开源

JDK7虽然已经发布很长一段时间了,但开源社区对于其AIO的新特性貌似并不热情。对于通讯方面的技术诉求,彷佛你们都习惯于Netty、Mina。“Stop Trying to Reinvent the Wheel”不要重复造轮子,几乎每一个程序员都被灌输过这个概念,理所固然的沉浸在各自的温馨区,享受着开源社区提供的各项技术支撑。举个跟本文相契合的例子,若是工做中遇到通讯相关的需求,广大Java程序员脑海里首先想到的必然是Netty或Mina,即使从未接触过Netty/Mina,但在内心认定只有这两个框架才能解决本身面临的问题。这样的现状可能归咎于如今咱们太急躁,工做的压力导致没时间给本身充电,尤为是那种不经常使用且稍微有点深度的技术点,已经没心力再去细细琢磨了。所幸还有一批好学的程序员在工做之余作着一些看似平凡的事,踏踏实实专研这些技术点并做出一些小小的做品,同时为开源社区注入新鲜血液。目前码云上已知的Java AIO项目有tio、Voovan、baseio以及本文的主角:smart-socket,这几个做品还无任何一款能造成足够的影响力被广大Javaer承认,但经过开源的推广与磨练,相信将来AIO的开源环境会比如今更加繁荣。socket

smart-socket立项之初便已严苛的要求进行开发,追求各方面都达到极致。首先,smart-socket是个很是轻量级的项目,只有依赖log4j2做为项目的日志组件。smart-socket发布的jar包仅仅20KB,简洁的接口设计能够很是方便的在业务中接入通讯服务。不过咱们更指望看到的是接触到smart-socket的朋友能够将其做为学习Java Socket编程的素材,若是smart-socket能在这方面给予您一丝帮助,那我便会绝对本身作了一件有意义的事。ide

官方指南假设您已了解ByteBuffer,并对Socket编程具有必定基础。若是您刚开始接触Socket,将smart-socket做为您的第一步可能不是个好的决定。学习

Maven依赖

smart-socket已上传至Maven仓库,使用前须要向其引入您的项目工程中。ui

<!-- https://mvnrepository.com/artifact/org.smartboot.socket/aio-core -->
<dependency>
    <groupId>org.smartboot.socket</groupId>
    <artifactId>aio-core</artifactId>
    <version>1.3.2</version>
</dependency>

通讯开发

基于smart-socket进行通讯服务的开发,主要有三个步骤:this

  1. 协议编解码
  2. 消息处理
  3. 启动服务

接下来咱们会经过一个简单例子来演示如何经过smart-socket开发服务端与客户端程序。为简化操做,服务端与客户端交互的数据为一个整型数据。

1、协议编解码

正常状况下服务端与客户端通讯共用同一套协议规则,所以咱们只需编写一份协议编解码实现便可。以下所示,协议编解码的须要实现接口Protocol。

public class IntegerProtocol implements Protocol<Integer> {

    private static final int INT_LENGTH = 4;

    @Override
    public Integer decode(ByteBuffer data, AioSession<Integer> session, boolean eof) {
        if (data.remaining() < INT_LENGTH)
            return null;
        return data.getInt();
    }

    @Override
    public ByteBuffer encode(Integer s, AioSession<Integer> session) {
        ByteBuffer b = ByteBuffer.allocate(INT_LENGTH);
        b.putInt(s);
        b.flip();
        return b;
    }
}

上述代码很简单,一个整数的长度为4byte,因此只要长度大于等于4,咱们就能解析到一个整数。

2、消息处理

业务消息的处理须要实现接口MessageProcessor,该接口只有两个方法:process,stateEvent。其中 stateEvent用于定义AioSession状态机的监控与处理。process则会处理每个接收到的业务消息。

服务端

public class IntegerServerProcessor implements MessageProcessor<Integer> {
    @Override
    public void process(AioSession<Integer> session, Integer msg) {
        Integer respMsg = msg + 1;
        System.out.println("接受到客户端数据:" + msg + " ,响应数据:" + (respMsg));
        try {
            session.write(respMsg);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void stateEvent(AioSession<Integer> session, StateMachineEnum stateMachineEnum, Throwable throwable) {

    }
}

客户端

public class IntegerClientProcessor implements MessageProcessor<Integer> {
    private AioSession<Integer> session;

    @Override
    public void process(AioSession<Integer> session, Integer msg) {
        System.out.println("接受到服务端响应数据:" + msg);
    }

    @Override
    public void stateEvent(AioSession<Integer> session, StateMachineEnum stateMachineEnum, Throwable throwable) {
        switch (stateMachineEnum) {
            case NEW_SESSION:
                this.session = session;
                break;
            default:
                System.out.println("other state:" + stateMachineEnum);
        }

    }

    public AioSession<Integer> getSession() {
        return session;
    }
}

3、启动服务

服务端

public class IntegerServer {
        public static void main(String[] args) {
            AioQuickServer server = new AioQuickServer()
                    .bind(8888)
                    .setProtocol(new IntegerProtocol())
                    .setProcessor(new IntegerServerProcessor());
            try {
                server.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

客户端

public class IntegerClient {
        public static void main(String[] args) throws Exception {
            IntegerClientProcessor processor=new IntegerClientProcessor();
            AioQuickClient aioQuickClient=new AioQuickClient()
                    .connect("localhost",8888)
                    .setProtocol(new IntegerProtocol())
                    .setProcessor(processor);
            aioQuickClient.start();
            processor.getSession().write(1);
            Thread.sleep(1000);
            aioQuickClient.shutdown();
        }
    }
相关文章
相关标签/搜索