Linux java + apache mina + maven 实现高并发服务器

一. 背景介绍

       要在Linux上面跑一段高并发的服务器程序而且Linux我是没有图形界面的只能通过xshell来远程登入,准备用apache mina开源库来实现,选择了maven 构建JAVA工程。在windows eclipse里面敲代码。在Linux上面运行。

二. 环境搭建

  • Linux上面环境配置
1. Linux JDK安装

1). 创建安装目录 /usr/java (新建了java目录)

2). 下载rpm文件 官网下载地址 我下载的是下载的是 jdk-7u79-linux-x64.rpm 文件。然后把下载的文件放到/usr/java目录下面。

3). 安装 命令: rpm -ivh jdk-7u79-linux-x64.rpm

4). 配置环境变量。命令: vi /etc/profile 在文件最后加入如下信息。保存退出。 在执行命令:source /etc/profile 使环境变量生效。

# add for java jdk(tuacy 2015.8.31)
export JAVA_HOME=/usr/java/jdk1.7.0_79
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

5). 测试 命令 java -version。

2. Linux maven安装(其实可以不用安装我们在windows 下面打不出jar文件直接放到Linux下面运行也可以)

1). 创建安装目录 /usr/maven (新建了maven目录)。

2). 下载文件 官网下载地址CSDN下载 我下载的是 apache-maven-3.2.3-bin.tar.gz 然后把下载的文件放到 /usr/maven 下面。

3). 解压 命令: tar -zvxf apache-maven-3.2.3-bin.tar.gz

4). 配置环境变量。命令: vi /etc/profile 在文件最后加入如下信息。保存退出。 在执行命令:source /etc/profile 使环境变量生效。

    # add for maven(tuacy 2015.8.31)
    export M3_HOME=/usr/maven/apache-maven-3.2.3
    export PATH=${M3_HOME}/bin:${PATH}

5) 测试 mvn -v

  • Windows maven安装(假设你已经在Windows上面有eclipse的开发环境了)

因为要在Windows下面敲一些maven的打包命令,所以才装maven。
1). 下载文件 官网下载地址CSDN下载地址我下载的是 apache-maven-3.3.3-bin.zip文件。

2). 解压 我解压地址是 D:\Program Files

3). 添加环境变量 先新建环境变量 MAVEN_HOME 值为D:\Program Files\apache-maven-3.3.3 然后再path中添加;%MAVEN_HOME%\bin

4). 测试 mvn -v

5). Eclipse上面做一些简单的配置,如果没有maven插件要先安装。

设定maven安装的路径 我们刚才解压的目录 D:\Program Files\apache-maven-3.3.3
这里写图片描述

设定maven的配置文件为D:\Program Files\apache-maven-3.3.3\conf\settings.xml
这里写图片描述

三. 代码下载地址

工程代码下载地址 JAVA apache mina

对应的客户端测试程序下载地址 C语言

四. 代码简单介绍

我是在Windows Eclipse下面敲代码,maven编译(可以在Windows下面编译把打包生产的jar文件和lib文件放到Linux下面运行,也可以把整个工程放到Linux下面编译Linux下面我们已经安装了maven和jdk了)。

代码中主要用到了apache mina开源库,log4j来记录log文件,mysql开源库我只是测试了下数据库能正常连上。

【1】. main函数

       传入端口,自定义一个log文件的名字 用端口来命名。(因为可能会同时运行三次程序每次传入不同的端口,为了区分log文件名才这么干的)。

【2】. apache mina的使用了

       1)encoder 有四个encode 代码如下,因为我回复给客户端的数据有四种类型。(返回数据给客户端的时候会调用),具体可以参考代码。

/** encoder we have 4 encoder object */
        codecFactory.addMessageEncoder(ResponseNormalMessage.class, new GnetPackageEncoder<ResponseNormalMessage>());
        codecFactory.addMessageEncoder(ResponseAutoMessage.class, new GnetPackageEncoder<ResponseAutoMessage>());
        codecFactory.addMessageEncoder(ResponseAutoAndCountMessage.class, new GnetPackageEncoder<ResponseAutoAndCountMessage>());
        codecFactory.addMessageEncoder(ResponseAutoAndForcedMessage.class, new GnetPackageEncoder<ResponseAutoAndForcedMessage>());

       2)decoder decoder的数据,如果客户端发过来的数据也有好几种类型,哪个会在 代码中GnetHandler 类中messageReceived函数的参数message instanceof 下判断是哪种数据。做出不同的处理。

        /** decoder only one decoder object */
        codecFactory.addMessageDecoder(new GnetPackageDecoder());

       3)加入处理器(GnetHandler)到Acceptor

        // 加入处理器(GnetHandler)到Acceptor
        acceptor.setHandler(new GnetHandler());

       4)剩下的一些配置都是网上扒的半猜半看的。具体见代码里面。

       5)apache mina 的流程:
               (1). 客户端发送过来的数据先到GnetPackageDecoder类中,decodable 这个函数是判断这个包有没有收完整,decode 函数则是把网络发过来的数据解析成我们的数据(代码中的解析过程可以忽视)。
               (2). 数据再到GnetHandler 类的messageReceived 类中。我们对不同的数据做不同的相应处理。
               (3). 数据再到GnetPackageEncoder 把我们的数据encoder成网络流,这样就发送给客户了。

【3】. log4j的使用

一定要在包的目录下面放log4j.properties文件要不就会报异常。log4j.properties文件信息如下,定义了一个终端输出一个文件输出。文件的名字example.log 我会在代码中有把他改掉(因为我一下子要启动三个端口为了区分log文件的名字,具体见代码部分)。具体怎么把log信息写入文件中也可以看代码的实现。

# Set Print to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# Set Print layout
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# customer style
# %r: time  
# %t: function name
# %p: priority (DEBUG/INFO/ERROR)  
# %c: class name (contain package name)
# %l: position(line)
# %m: out put message  
# %n: new line
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

# Set Print to log file info
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d %p %t %c %l - %m%n
【4】. pom.xml 文件

maven 中的文件。里面有一些开发者的信息的描述,一些工程中要应用的开源库的依赖,还有build的一些处理。具体可以看代码中的pom.xml文件。

五. 工程编译

因为服务器上面可能没有配置maven编译环境。所以肯定不能这么运行。我们的想办法生产jar可执行文件。上面我们在Linux装了maven,所以我们也可以直接把整个工程弄到Linux下面去编译。

生成jar文件的步骤

1). mvn dependency:copy-dependencies -DoutputDirectory=target/lib 把第三方依赖包全部导入到 target/lib目录下面。

2). 利用maven-jar-plugin修改META-INF\MANIFEST.MF 清单文件 这个我们会在pom.xml文件里面做好。这个可以不用管。可以看pom.xml文件里面build节点部分。

3). mvn package 这样就打包出来了我们要的jar文件。在target目录下面。

4). java -jar xxx.jar 如果要在后台运行,前面加 nohup。(部署时把jar包和lib目录,都上传到服务器上) 注意我们的代码中main函数是要参数的所以我们的运行方式应该是 我就直接在Windwons下面运行测试的,先cd到工程的target目录下面。运行的命令是。

java -jar apache_mina_maven-0.0.1-SNAPSHOT.jar 8111 (8111是我们main函数要传入的端口号,jar文件是我们生产的文件名)

如果你Linux没有maven环境,是在Window下面打包jar之后放在Linux下面运行那么要把target下面的lib目录和生产的jar包同时放到linux下面去运行。因为lib里面有我们依赖的一些开源库。

注:Linux下面必须要有JDK。

具体的内容都在代码里面哦。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值