由于要做手机端安卓程序,所以使用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. jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——总结与性能分析

    Sizzle引擎的主体部分已经分析完毕了,今天为这部分划一个句号. a. Sizzle解析流程总结 是时候该做一个总结了.Sizzle解析的流程已经一目了然了. 1.选择器进入Sizzle( sele ...

  2. react入门(1)

    这篇文章也不能算教程咯,就算是自己学习整理的笔记把. 关于react一些相关的简介.优势之类的,随便百度一下一大堆,我就不多说了,可以去官网(http://reactjs.cn/)看一下. 这片主要讲 ...

  3. Python字典实现分析

    背景介绍 最近使用Python开发项目为主,当使用到字典时感觉非常方便实用.那么好奇心就驱使我要搞清楚字典是怎么实现的.为了真正的搞清楚字典的实现就不得不使用C语言来实现一遍,为此我查了一些资料现在总 ...

  4. VS2012 C#使用/配置Log4Net

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   本节探讨如何在VS2012中使用Log4Net 1. ...

  5. securityPolicy与安全策略等级配置

    securityPolicy配置节是定义一个安全策略文件与其信任级别名称之间的映射的集合.配置如下所示 其中name是指定映射到策略文件的命名的安全级别,一般的值有Full,Hight,Medium, ...

  6. js的touch事件的实际引用

    一开始做前端页面的时候,接触的也是js,但是随后便被简单高效的jquery吸引过去,并一直使用至今. 而js,则被我主观的认为底层技术而抛弃. 直到这几天工作需要,研究移动端页面的触屏滑动事件,搜索j ...

  7. 引用js实现checkbox批量选中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. onclick标签变成小手状

    style=“cursor: pointer;”

  9. C++_系列自学课程_第_4_课_string_《C++ Primer 第四版》

    相信学习过计算机编程的人,基本应该都接触过C语言,在C语言中处理字符串大家一定多遇到过, 也都知道处理字符串非常麻烦,而在C++里面,由标准库string类提供对可变长的字符串的支持.下面 来看看st ...

  10. 十一个行为模式之备忘录模式(Memento Pattern)

    定义: 在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存.当对象出错或者无效是,可以根据该备忘录进行恢复. 结构图: Originator:原发类,被记录的对象,包含若干内部状态.一 ...