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做为您的第一步可能不是个好的决定。学习
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
接下来咱们会经过一个简单例子来演示如何经过smart-socket开发服务端与客户端程序。为简化操做,服务端与客户端交互的数据为一个整型数据。
正常状况下服务端与客户端通讯共用同一套协议规则,所以咱们只需编写一份协议编解码实现便可。以下所示,协议编解码的须要实现接口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,咱们就能解析到一个整数。
业务消息的处理须要实现接口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; } }
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(); } }