1 Star 0 Fork 1.1K

dream / smart-socket

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

简介

过去的几年一直在研究NIO技术,虽说没做出什么成绩,但对于Socket技术也是有了一定的了解。从2017年7月份正式开始接触AIO,尽管起步比较晚,但进步还是非常快的。断断续续的用了几周时间写了这个AIO版的通信框架smart-socket,目前的它非常轻量级,核心代码量才600多行,期待它成长后的模样。

性能测试报告

项目 结果
CPU i7-4790 3.60Ghz
内存 8G
测试代码 服务端:P2PServer,客户端:P2PMultiClient
测试时长 大于两分钟(服务端与客户端启动后的第一分钟数据是无效的,因为实际未跑满一分钟)
时间单位 1分钟
数据总流量 7064MB
消息大小 33B
消息数 224484842

开发手册

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

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

接下来我们会通过一个简单例子来演示如何通过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) {
        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);
        return b;
    }
}

上述代码很简单,一个整数的长度为4bit,所以只要长度大于等于4,我们就能解析到一个整数。

消息处理

业务消息的处理需要实现接口MessageProcessor,该接口只有两个方法:process,initSession 。其中 initSession仅在建立连接时调用一次,可在该方法中进行会话的初始化操作。process则会处理每一个接收到的业务消息。

服务端

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

    @Override
    public void initSession(AioSession<Integer> session) {

    }
}

客户端

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

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

    @Override
    public void initSession(AioSession<Integer> session) {
        this.session = session;
    }

    public AioSession 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();
    }
}

推荐项目

关于作者

Edit By Seer
E-mail:zhengjunweimail@163.com
QQ:504166636

Update Date: 2017-08-24

空文件

简介

基于AIO实现的通信框架,性能表现只能用“爆炸”两个字形容。目前不求功能丰富,只追求性能极致,核心代码仅600多行,简单粗暴接地气 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/xiaoshanying/smart-socket.git
git@gitee.com:xiaoshanying/smart-socket.git
xiaoshanying
smart-socket
smart-socket
master

搜索帮助