网络通讯应用，一般要用到网络开发包（比如，Smart-Socket、Netty）。本案演示一个简单的 TcpServer（就是自定义 Tcp 协议开发）。



### 1、启动主类

启动 Solon 容器：demo/App.class

```java
@SolonMain
public class App {
    public static void main(String[] args) {
        Solon.start(App.class, args);
    }
}
```

### 2、添加 TcpServer 生命周期组件

生命周期组件（实现 LifecycleBean 接口的组件），可将网络通讯框架的启动与关闭，自动整合到 Solon 的应用生命周期。之后，就是自定义协议处理代码。其它具有“启动”与“关闭”特性的框架，也可以采用生命周期组件进行整合。

```java
@Component
public class TcpServer implements LifecycleBean {

    @Override
    public void start() throws Throwable {
        ...
    }

    @Override
    public void stop() throws Throwable {
        ...
    }
}
```

 
### 3、for Smart-Socket 示例

具体开发，请参考 Smart-Socket 官网资料！

* 定义 TcpServer 组件

```java
@Component
public class TcpServer implements LifecycleBean {
    private AioQuickServer server;

    @Override
    public void start() throws Throwable {
        server = new AioQuickServer(8888, new DecoderProtocolImpl(), new MessageProcessorImpl());
        server.start();
    }

    @Override
    public void stop() throws Throwable {
        if (server != null) {
            server.shutdown();
        }
    }
}
```

* 协议实现代码

```java
//解码协议实现
public class DecoderProtocolImpl implements Protocol<String> {
    @Override
    public String decode(ByteBuffer readBuffer, AioSession session) {
        //一个定长结构的字符串消息包：len(int)msg(string)
        int remaining = readBuffer.remaining();
        if (remaining < Integer.BYTES) {
            return null;
        }
        readBuffer.mark();
        int length = readBuffer.getInt();
        if (length > readBuffer.remaining()) {
            readBuffer.reset();
            return null;
        }
        byte[] b = new byte[length];
        readBuffer.get(b);
        readBuffer.mark();
        return new String(b);
    }
}

//消息处理实现
public class MessageProcessorImpl implements MessageProcessor<String> {
    @Override
    public void process(AioSession session, String msg) {
        System.out.println("receive from client: " + msg);
    }
}
```


