使用spring容器管理和配置netty

示例代码

为了使程序达到方便配置和管理,spring的ioc容器是特效药之一。本文将使用ioc来管理和配置netty服务器

服务端使用Reactor多线程模型。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <!--因为使用了sl4j,所以去掉commons-logging-->
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>


<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.34.Final</version>
</dependency>

具体JAVA代码详见示例代码

启动有两种方式:

  1. 通过运行 com.xyzla.netty.spring.TestServer 中main方法 直接启动 netty;
  2. 以web项目方式 启动netty,有两种方式:
    1. 通过配置 spring-common.xml,如 <bean id="myNettyServer" class="com.xyzla.netty.spring.server.ServerManager" init-method="startServer" destroy-method="stopServer"/>
    2. 通过配置 web.xml,如 <listener><listener-class>com.xyzla.netty.spring.NettyListener</listener-class></listener>

注意:不要在Tomcat主线程启动,那样会锁死后面的操作,可以new Thread(){启动netty服务}.start()

测试代码:

public class TcpClient {

    private static String serverIp = "127.0.0.1";
    private static int serverPort = 9090;

    public static void main(String[] args) throws IOException {
        byte[] b = "2013年5月,习近平在天津调研时提出,要谱写新时期社会主义现代化的京津“双城记”。2013年8月,习近平在北戴河主持研究河北发展问题时,又提出要推动京津冀协同发展。此后,习近平多次就京津冀协同发展作出重要指示。三地推进协同发展的共识加快形成,方向日渐清晰。尤其是2017年4月1日,设立雄安新区的消息一经公布,举世瞩目。".getBytes();
        send(b);
    }


    public static byte[] send(byte[] sendData) throws UnknownHostException, IOException {
        Socket socket = new Socket(serverIp, serverPort);
        OutputStream os = socket.getOutputStream();
        InputStream is = socket.getInputStream();
        byte resultArray[] = new byte[1];
        try {
//            BufferedReader in = new BufferedReader(new InputStreamReader(is));

            // 定义一个发送消息协议格式:|--header:4 byte--|--content:10MB--|
            // 获取一个4字节长度的协议体头
            byte[] dataLength = intToByteArray(4, sendData.length);
            // 和请求的数据组成一个请求数据包
            byte[] requestMessage = combineByteArray(dataLength, sendData);
            //发送数据-------------------------------
            os.write(requestMessage);
            os.flush();
            //接收数据-------------------------------
//            resultArray = IOUtils.toByteArray(is);
            System.out.println("11--in:" + is + "  --out:" + os);
            byte ibuf[] = new byte[1024];
            int len = is.read(ibuf);
            String s = new String(ibuf, 0, len);
            System.out.print(len + s);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            os.close();
            is.close();
            socket.close();
        }
        return resultArray;
    }

    private static byte[] intToByteArray(int byteLength, int intValue) {
        return ByteBuffer.allocate(byteLength).putInt(intValue).array();
    }

    private static byte[] combineByteArray(byte[] array1, byte[] array2) {
        byte[] combined = new byte[array1.length + array2.length];
        System.arraycopy(array1, 0, combined, 0, array1.length);
        System.arraycopy(array2, 0, combined, array1.length, array2.length);
        return combined;
    }
}

参考

  1. 使用spring容器管理和配置netty
  2. Tomcat 通过listener 启动netty 服务
  • qq_43638135
    妲己再美究为妃: 博主没有想过自己接一些私活干吗?我现在还没毕业,但是我也确实听说外挂市场自动化游戏脚本市场挺火热的,并且报酬也很丰厚,但是具体的我也不是很清楚,求解答。 (1个月前 #47楼) 查看回复(2) 举报 回复
    22