最近项目中有遇到后台接收硬件终端发送的数据并解析存储的需求,代码总结如下(有时间再来一一讲解,最近比较忙):

@Override
public void start() {
ExecutorService pool = Executors.newCachedThreadPool();
try {
if (enable) {
return;
}
enable = true;
serverSocket=new ServerSocket(port);
Socket socket = null;
BufferedInputStream reader = null;
BufferedOutputStream writer = null;
while (enable) {
try {
socket=serverSocket.accept();//阻塞方法
socket.setSoTimeout(100000); // start byte example
reader = new BufferedInputStream(socket.getInputStream());
writer = new BufferedOutputStream(socket.getOutputStream());
int totalChar = 84;
byte[] body = new byte[totalChar];
int len = reader.read(body, 0, 84);
if (len < totalChar) {
logger.error("收到包ERROR: " + new String(body, "UTF-8") + " 长度: " + len);
logger.info("收到包ERROR: " + ByteUtil.bytesToBit(body));
logger.info(ByteUtil.parseByte2HexStr(body));
if (null != socket && !socket.isClosed()) {
socket.close();
}
continue;
} else {
logger.info("收到包: " + new String(body, "UTF-8"));
logger.info(ByteUtil.bytesToBit(body));
logger.info(ByteUtil.parseByte2HexStr(body));
} T409_car_collects dbcollect = new T409_car_collects(); //硬件数据存储在这个对象中 byte[] idBytes = new byte[17];
System.arraycopy(body, 0, idBytes, 0, 17);
String id = new String(idBytes);
dbcollect.setTerminalid(id); //TODO } catch (Exception e) {
logger.error("Parse socket error. ", e);
if (null != socket && !socket.isClosed()) {
socket.close();
}
}
}
} catch (IOException e) {
logger.error("", e);
} finally {
pool.shutdown();
} }
@Override
public void stop() {
enable = false;
if (null != serverSocket && !serverSocket.isClosed()) {
try {
serverSocket.close();
} catch (IOException e) {
logger.error("close serverSocket err.", e);
}
}
} class Handler implements Runnable {
private T409_car_collects collect; private Socket socket; Handler(T409_car_collects collect, Socket socket) {
this.collect = collect;
this.socket = socket;
} @Override
public void run() {
// TODO
System.out.println("serv handler: "+collect.getRemark()); logger.error(MessageFormat.format("Terminalid {0} is not exist.", collect.getTerminalid())); T410_car_collects_log collect_log = new T410_car_collects_log();
BeanUtils.copyProperties(collect,collect_log);
BeanUtils.copyProperties(collect_log,collect);
t410_car_collects_logMapper.insertSelective(collect_log);
List<T409_car_collects> ext = carownerService.getcar_runningdatabyterminalid(collect.getTerminalid());
if(ext ==null ){
t409_car_collectsMapper.insertSelective(collect);
}else{
collect.setId(ext.get(0).getId());
Date now = new Date();
collect.setUpdatetime(now);
t409_car_collectsMapper.updateByPrimaryKeySelective(collect);
} try {
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"),true);
pw.println("back to client.");
pw.flush();
} catch (Exception e) {
logger.error("send back socket client err.", e);
} finally {
try {
socket.close();
} catch (IOException e) {
logger.error("close socket err.", e);
}
}
} }

Java后台创建Socket服务接收硬件终端发送的数据的更多相关文章

  1. Java 后台创建word 文档

    ---恢复内容开始--- Java 后台创建 word 文档 自己总结  网上查阅的文档 分享POI 教程地址:http://www.tuicool.com/articles/emqaEf6 方式一. ...

  2. PHP创建socket服务

    PHP可以创建socket服务. 先熟悉几个php网络方面的函数,操作手册地址  http://php.net/manual/zh/ref.sockets.php 简单介绍下socket,它表示套接字 ...

  3. AutoCAD.net支持后台线程-Socket服务端

    最近因为公司项目的需求,CAD作为服务端在服务器中常驻运行,等待客户端远程发送执行任务的指令,最终确认用Socket-tcp通讯,CAD需要实时监听客户端发送的消息,这时就需要开启线程执行Socket ...

  4. Python3学习之路~8.2 socket简单实例 实现ssh 发送大量数据

    实例1: 利用socket模拟客户端和服务器端各自收发一次数据: #Author:Zheng Na # 客户端 import socket # 声明socket类型,同时生成socket连接对象 cl ...

  5. STM32F4 串口实验中收不到超级终端发送的数据,调试工具却可以

    我用串口精灵发送数据没有问题,但是接收数据没反应. 串口接受的时候必须要用中断的,你发送只靠单一的标志位是可以判断的,但是接受的时候,你是一直停留在while里面,我们判断接受是否完成,通过检测是否收 ...

  6. C#创建socket服务

    1.新建windows服务,名称(WebSendMsgSocket,注意检查属性-版本号)  双击Service1.cs打开设计视图,在设计视图中右键,选择添加安装程序   安装serviceProc ...

  7. jquery通过ajax向后台发送(checkbox)数组,并在后台接收,(发送的数据是checkedbox)

    版权声明:本文为博主原创文章,未经博主允许不得转载. $(document).ready(function(){ var flag = 1; $("#delBtn").click( ...

  8. 表单提交数据量大于2m,java 后台接受不到表单传递过来的数据

    一般来说 post请求提交的数据无大小限制,但是tomcat 设置默认的表单传输数据大小不能2m,这时候当数据大于2m后台接收达不到表单的数据,需要修改tomcat的server.xml的的maxPo ...

  9. 使用客户端软件向服务端php程序发送post数据,php接受三种方法

    方法一:$_POST; 方法二:$GLOBALS['HTTP_RAW_POST_DATA'],需要在php.ini开启 always_populate_raw_post_data = On: 方法三: ...

随机推荐

  1. 2019-6-5-VisualStudio-开启仅我代码调试

    title author date CreateTime categories VisualStudio 开启仅我代码调试 lindexi 2019-06-05 19:29:44 +0800 2019 ...

  2. @bzoj - 4709@ 柠檬

    目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 一共有 N 只贝壳,编号为 1...N,贝壳 i 的大小为 si. ...

  3. angularjs 自定义指令弹窗

    (function() { 'use strict'; angular.module('frontierApp') .directive('confirmPopup', ['$timeout', Co ...

  4. Win7如何显示文件后缀

    有些时候,我们需要修改文件的后缀名,但是Windows7系统默认不显示文件后缀.我们怎样显示和修改文件后缀呢?请接着往下看. 工具/原料   一个win7系统 方法/步骤   1 如图所示,此时是无法 ...

  5. Vue6——v-model实现数据双向绑定

    博客地址 :https://www.cnblogs.com/sandraryan/ v-model 用于input标签,用于实现双向绑定,及时把数据的变化渲染在页面 双向绑定及原理 举个双向绑定的简单 ...

  6. SuperSocket特点

    ²  简单易用,只需要几个类就能创建出健壮的Socket服务器端程序 ²  性能优良, 稳定可靠 ²  支持各种协议, 内置的协议解析工具让你把实现通信协议这种复杂的工作变得很简单 ²  自动支持SS ...

  7. HTML静态网页--JavaScript-简介

    JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司(已 ...

  8. pip 指定目录安装

    pip install --target=d:\somewhere\other\than\the\default    package_name

  9. mybatis PageHelper分页插件 和 LRU算法缓存读取数据

    分页: PageHelper的优点是,分页和Mapper.xml完全解耦.实现方式是以插件的形式,对Mybatis执行的流程进行了强化,添加了总数count和limit查询.属于物理分页. 一.首先注 ...

  10. 央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家

    央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家 ——已接入NFCS的P2P网贷机构将优先 接入央行征信系统   P2P网贷行业的健康发展依赖于信用体系的支撑和保障,加快完善适应 ...