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

@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. ODT 珂朵莉树 入门

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  2. DECLARE

    -- 修正用プログラム DECLARE    CURSOR c_adv_fee_detail IS        SELECT adv_fee.fee_mgmt_num,                ...

  3. H3C 快速以太网和千兆以太网

  4. windows/Linux/Mac下安装maven,maven作用

    Linux下安装maven 1.首先到Maven官网下载安装文件,目前最新版本为3.0.3,下载文件为apache-maven-3.3.9-bin.tar.gz,下载可以使用wget命令: 2.进入下 ...

  5. iptables command 常用命令列表

    命令 -A, --append 范例 iptables -A INPUT ... 说明 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则. 命令 -D, --delete 范例 iptab ...

  6. H3C 配置NAPT

  7. java数组简介

    数组(Array)是Java 语言中内置的一种基本数据存储结构,通俗的理解,就是一组数的集合,目的是用来一次存储多个数据.数组是程序中实现很多算法的基础,可以在一定程度上简化代码的书写. 备注: 数组 ...

  8. Python--day39--管道和数据共享(面试可能会问到)

    1,管道 上面所述挂起即为阻塞 管道.py from multiprocessing import Pipe, Process def func(conn1,conn2): conn2.close() ...

  9. SVN提示update更新成功,但是本地文件却没有更新

    问题描述:将仓库的最新版本代码check out到本地后,然后最某个文件做了修改,保存后想通过svn的update来重新得到最新的版本,发现失效. 原因:经过多方查找原因,主要看了以下两篇文档 htt ...

  10. js 操作字符串方法记录

    var str="helloworld"; 这三个方法如果只传一个参数默认截取到最后..将截取的字符返回,对原字符串没有任何改变 slice(star,end)//从索引star开 ...