java服务器端编程
由于要做手机端安卓程序,所以使用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服务器端编程的更多相关文章
- 20145205 《Java程序设计》实验报告五:Java网络编程及安全
20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...
- Java EE 编程中路径
版权声明:未经博主允许,不得转载 首先我们要限定一个范围,是一个项目,或是以个访问地址..就先以一个项目为限定的范围 前述: 学过物理学的都知道相对运动和绝对运动, 虽然是相似的概念,但这里的要简单得 ...
- java socket编程(网络编程)
一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- 20145212 实验五《Java网络编程》
20145212 实验五<Java网络编程> 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成 ...
- 20145213《Java程序设计》实验五Java网络编程及安全
20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...
- Java Socket编程题库
一. 填空题 ___ IP地址____用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 统一资源定位符URL是指向互联网"资源"的指针,由4部分组成:协议 ...
- java net编程
转自:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台 ...
- 20145337实验五Java网络编程及安全
20145337实验五Java网络编程及安全 实验内容 掌握Socket程序的编写 掌握密码技术的使用 设计安全传输系统 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器 ...
- Java程序员从笨鸟到菜鸟之(十三)java网络通信编程
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所 ...
随机推荐
- .NET环境下基于RBAC的访问控制
.NET环境下基于RBAC的访问控制 Access Control of Application Based on RBAC model in .NET Environment 摘 要:本文从目前信息 ...
- react入门(4)
首先还是来回顾一下前三篇讲的内容 react入门(1): jsx,组件,css写法 react入门(2):事件,this.props.children,props,...other react入门(3 ...
- C# NPOI导出Excel和EPPlus导出Excel比较
系统中经常会使用导出Excel的功能. 之前使用的是NPOI,但是导出数据行数多就报内存溢出. 最近看到EPPlus可以用来导出Excel,就自己测了下两者导出上的差异. NPIO官网地址:http: ...
- 【Win10开发】处理PC上的后退键
我们知道在win10手机上和平板上都会有后退键,那么PC上该怎么办呢?没关系我们慢慢揭晓. 如果你已经是UWP的忠实用户,那么肯定会见到如下的后退键. 那么我们如何来做出来呢?, 我们首先打开App. ...
- C#如何静态调用C++中的方法(静态调用dll)
当我们想要在C#中使用C++项目的方法时,这个时候就可以通过调用C++项目的dll来实现,它有静态和动态调用两种方法. DLL(Dynamic Link Library)文件为动态链接库文件,又称“应 ...
- Redis 学习笔记(C#)
Redis安装及简单操作 Windows下安装步骤: 1. 第一步当然是先下载咯~ 地址:https://github.com/dmajkic/redis/downloads (根据自己实际情况选择 ...
- svn提交时出现很多乱文件怎么解决
在我们开发项目中的时候经常使用到svn,有时候我们commit的时候回出现很多无用的文件,这些文件就是未版本化的文件,怎么解决这些乱文件的问题呢? svn commit提交的时候有个"sho ...
- jquery动态改变div宽度和高度
效果体验:http://keleyi.com/keleyi/phtml/jquery/23.htm 完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD X ...
- 原型对象prototype和原型属性[[Prototype]]
构造器:可以被 new 运算符调用, Boolean,Number,String,Date,RegExp,Error,Function,Array,Object 都是构造器,他们有各自的实现方式. 比 ...
- css水平垂直居中(绝对定位居中)
使用绝对定位有个限制就是父集必须设置一个固定的高度. 首先HTML <div id="box"> <div class="child"> ...