Java服务器端编程

发表于:2016-1-22 12:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:zhaojieTec    来源:51Testing软件测试网采编

  由于要做手机端安卓程序,所以使用java来开发。后来又看了javaweb,觉得java还是很不错的,功能很强大,可以做很多事,最重要的是资源非常丰富,有很多开源的库框架之类。
  最近用java做一个服务器端程序,于是就记录下吧。
  实际上是一个控制台程序,功能并复杂,主要是开一个socket端口,然后有传感器设备连接过来,连上以后就不停的接受和发送数据,收的数据以后做一下解析,再将数据保存到数据库中。
  由于要操作数据库,所以就直接把web端用的东西直接拿过来,使用spring+hibernate,这样就不用去搞数据库链接之类的事情了,和web项目一样,通过maven来引入需要的jar包,改一下web项目中使用的pom.xml把不需要的东西去掉。
  可能是spring一般都在web项目中使用,在做控制台程序的时候,打包出来点问题,在调试的时候运行没有问题,但打包以后,使用java -jar 的方式来运行就出错了,主要是因为找不到schema,不过还好,经过一番搜索这个问题很快就解决了。
  使用一个maven插件,打包的时候对依赖的schema文件进行处理就可以了。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>----文件名称-----</finalName>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>jar-with-dependencies</shadedClassifierName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.xxxx.xxxx</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.tooling</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
  加入spring和hibernate之后,这个控制台就有了很好的操作数据库的能力,可以使用orm这很方便的。另外也可以使用spring提供的定时器功能了,这个项目中是需要使用定时任务的。
  服务器程序,日志是要有的,使用log4j就可以了,log4j在一般的web项目中都有,直接拿过来就可以。
  这些东西都配置好以后,实际上工作就已经完成了三之一。
  这里再说一下socket吧,在客户连接过来的时候,有几种不同的处理方式。
  1.将所有的客户端连接放到一个列表里,然后再开单独的线程,对列表中的连接进行处理,比如遍历客户端的列表读取发送过来的数据,这种方式有一个缺点,就是在读取数据有时候如果客户端网络异常线程就会阻塞,虽然可以设置超时,但读取的线程卡在那里影响其他的客户端是不太好的。
  2.有客户端连过来的时候就开一个新的线程,这样客户端之间就不会互相影响了,但如果客户端太多开太多的线程会占用较多的服务器端资源。
  由于目前客户端数量不多,所以采用第二种方式。
  程序写好以后,就放到公司的一台pc机上测试运行了,第二天早上看的时候发现晚上9点多就卡在那里不动了,一开始以为是socket的问题,改了以后放在那里继续跑,第三天早上看还是卡在那里。然后写了一些测试的代码,发现是数据库连接池的问题,由于开了很多线程,数据库连接不够用了所以就卡在那里,改了一下c3p0的连接池的设置就好了。
  当然,如果并发连接数太多对数据库的性能是有影响的,cpu频率会升高。就目前的情况来看,客户端数量不多是没什么问题的,如果客户端的数量实在太多,就需要采用其他的方式来处理,比如让10个或者100个客户端共用一个线程,将socket和数据库操作放到不同的线程等等。当然这样程序就会变得比较复杂,需要用更多的时间来做,如果是要快速交付,就需要采用“简单粗暴”的方式。
  一般的程序都下不会对性能有非常高的要求,以至于要用c或者c++去做开发,基于开发效率考虑使用java开发是很不错的。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号