由于要做手机端安卓程序,所以使用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开发是很不错的。

java服务器端编程的更多相关文章

  1. 20145205 《Java程序设计》实验报告五:Java网络编程及安全

    20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...

  2. Java EE 编程中路径

    版权声明:未经博主允许,不得转载 首先我们要限定一个范围,是一个项目,或是以个访问地址..就先以一个项目为限定的范围 前述: 学过物理学的都知道相对运动和绝对运动, 虽然是相似的概念,但这里的要简单得 ...

  3. java socket编程(网络编程)

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  4. 20145212 实验五《Java网络编程》

    20145212 实验五<Java网络编程> 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成 ...

  5. 20145213《Java程序设计》实验五Java网络编程及安全

    20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...

  6. Java Socket编程题库

    一.    填空题 ___ IP地址____用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 统一资源定位符URL是指向互联网"资源"的指针,由4部分组成:协议 ...

  7. java net编程

    转自:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台 ...

  8. 20145337实验五Java网络编程及安全

    20145337实验五Java网络编程及安全 实验内容 掌握Socket程序的编写 掌握密码技术的使用 设计安全传输系统 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器 ...

  9. Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所 ...

随机推荐

  1. 资源等待类型sys.dm_os_wait_stats

    动态管理视图  sys.dm_os_wait_stats 返回执行的线程所遇到的所有等待的相关信息.可以使用该聚合视图来诊断 SQL Server 以及特定查询和批处理的性能问题. 列名 数据类型 说 ...

  2. 小白Linux入门 二

    参考: http://edu.51cto.com/lesson/id-11222.html CPU中有计算单元 控制单元.它通过桥接芯片与存储器进行匹配 其中北桥是高速 南桥是低速 包括IDE USB ...

  3. 开发漫谈:千万别说你不了解Docker!

    1dotCloud到Docker:低调奢华有内涵   写在前面:放在两年前,你不认识Docker情有可原.但如果现在你还这么说,不好意思,我只能说你OUT了.你最好马上get起来,因为有可能你们公司很 ...

  4. CCF——Z字形扫描问题

    试题编号: 201412-2 试题名称: Z字形扫描 时间限制: 2.0s 内存限制: 256.0MB 问题描述: 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag ...

  5. SqlServer 分页查询

    1.not in方法 select top 10 from books where id not in (select top 30 id from books)   2.row_number()函数 ...

  6. C#判断字符串是否是数字

    /// <summary> /// 判断字符串是否是数字 /// </summary> public static bool IsNumber(string s) { if ( ...

  7. canvas孙悟空脚踩白云今年是猴年

    效果查看:http://hovertree.com/texiao/html5/30/ 使用HTML5的canvas画的孙悟空,CSS3画的白云飘飘. 刚擒住了几个妖 又降住了几个魔 魑魅魍魉怎么他就这 ...

  8. 尝试加载 Oracle 客户端库时引发 BadImageFormatException

    尝试加载 Oracle 客户端库时引发 BadImageFormatException 工程师给计算机诊断,就像医生给病人诊断一样,很多同样的症状,可能是由多种截然不同的原因导致的.   最近进行C# ...

  9. C#知识点-委托

    一.什么是委托 委托和类一样,是一种用户自定义类型: 类表示的是数据和方法的集合,而委托则持有一个或多个方法: 二.委托的使用 1.声明委托类型 委托是类型,与类一样,委托类型必须在被用来创建变量以及 ...

  10. Collection框架

    Collection框架 集合框架(Collection Framework)泛指java.util包的若干个类和接口.如Collection,List,ArrayList,LinkedList,Ve ...