要在Linux上面跑一段高并发的服务器程序而且Linux我是没有图形界面的只能通过xshell来远程登入,准备用apache mina开源库来实现,选择了maven 构建JAVA工程。在windows eclipse里面敲代码。在Linux上面运行。
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。
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的打包命令,所以才装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开源库我只是测试了下数据库能正常连上。
传入端口,自定义一个log文件的名字 用端口来命名。(因为可能会同时运行三次程序每次传入不同的端口,为了区分log文件名才这么干的)。
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成网络流,这样就发送给客户了。
一定要在包的目录下面放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
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。
具体的内容都在代码里面哦。