zoukankan      html  css  js  c++  java
  • 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>
    View Code

    加入spring和hibernate之后,这个控制台就有了很好的操作数据库的能力,可以使用orm这很方便的。另外也可以使用spring提供的定时器功能了,这个项目中是需要使用定时任务的。

    服务器程序,日志是要有的,使用log4j就可以了,log4j在一般的web项目中都有,直接拿过来就可以。

    这些东西都配置好以后,实际上工作就已经完成了三之一。

    这里再说一下socket吧,在客户连接过来的时候,有几种不同的处理方式。
    1.将所有的客户端连接放到一个列表里,然后再开单独的线程,对列表中的连接进行处理,比如遍历客户端的列表读取发送过来的数据,这种方式有一个缺点,就是在读取数据有时候如果客户端网络异常线程就会阻塞,虽然可以设置超时,但读取的线程卡在那里影响其他的客户端是不太好的。
    2.有客户端连过来的时候就开一个新的线程,这样客户端之间就不会互相影响了,但如果客户端太多开太多的线程会占用较多的服务器端资源。

    由于目前客户端数量不多,所以采用第二种方式。

    程序写好以后,就放到公司的一台pc机上测试运行了,第二天早上看的时候发现晚上9点多就卡在那里不动了,一开始以为是socket的问题,改了以后放在那里继续跑,第三天早上看还是卡在那里。然后写了一些测试的代码,发现是数据库连接池的问题,由于开了很多线程,数据库连接不够用了所以就卡在那里,改了一下c3p0的连接池的设置就好了。

    当然,如果并发连接数太多对数据库的性能是有影响的,cpu频率会升高。就目前的情况来看,客户端数量不多是没什么问题的,如果客户端的数量实在太多,就需要采用其他的方式来处理,比如让10个或者100个客户端共用一个线程,将socket和数据库操作放到不同的线程等等。当然这样程序就会变得比较复杂,需要用更多的时间来做,如果是要快速交付,就需要采用“简单粗暴”的方式。

    一般的程序都下不会对性能有非常高的要求,以至于要用c或者c++去做开发,基于开发效率考虑使用java开发是很不错的。

  • 相关阅读:
    非正式介绍Python(二)
    用js采集网页数据并插入数据库最快的方法
    一张图轻松记住PHP的*类*以及private和protected的区别
    从php到浏览器的缓存机制,不得不看!
    webpack 兼容低版本浏览器,转换ES6 ES7语法
    DEDE织梦 后台特别卡,有时响应超时的解决办法
    vue iview Select bug,在低版本浏览器中报错
    mysql_connect 等待时间长,修改连接地址为127.0.0.1即可
    看完这篇文章才对【GIT】有了大彻大悟的认识
    一次请求对多条数据进行排序的算法(二)
  • 原文地址:https://www.cnblogs.com/zhaojietec/p/5149287.html
Copyright © 2011-2022 走看看