java多线程和长连接,三方转换通信的实践(2)——数据库端服务程序
为什么80%的码农都做不了架构师?>>>
本篇介绍的是数据库端服务程序ClientForApp,它主要是主动连接转换端Server,并执行检查连接是否正常,以及接收到转换端发来的网站请求数据进行数据库数据查询并返回结果。
下面首先展示“数据库端服务程序”(socket)端代码:(服务端由1/2/3组成)
1、ClientForApp:
public class ClientForApp {//记录日志Log log = LogFactory.getLog(this .getClass()); PublicAppService publicAppService=new PublicAppService();CommonTool commonTool=new CommonTool();private static MyBlockingQueue myBlockingQueue=new MyBlockingQueue(10);public static Socket socketWZ;final static String IP = "127.0.0.1"; //本地测试IPfinal static Integer PORT=9999;//连接服务器的端口public static void main(String[] args) {try{checkSocket checkSocket=new checkSocket(IP,PORT,myBlockingQueue);for(int i=4;i>0;i--){//每次建立4个长连接,由4个线程持有clientYWSS nksocket1 = new clientYWSS(IP,PORT,myBlockingQueue);new Thread(nksocket1).start();}Thread checkThread=new Thread(checkSocket);checkThread.setName("checkThread");new Thread(checkSocket).start();}catch (Exception e) {e.printStackTrace();}}
}
2、数据库端检查线程:checkSocket
public class checkSocket implements Runnable {CommonTool commonTool=new CommonTool();Socket socket;MyBlockingQueue myBlockingQueue;String IP;int PORT;/*** @param socket*/public checkSocket(String IP,int PORT,MyBlockingQueue myBlockingQueue) {super();this.myBlockingQueue = myBlockingQueue;this.IP=IP;this.PORT=PORT;}@Overridepublic void run() {while(true){try {if(myBlockingQueue.size()>0){//当线程安全队列中有socket才去检查,没有直接去创建for(int i=0;i<=myBlockingQueue.size();i++){socket=myBlockingQueue.get();if(null!=socket && !commonTool.isServerClose(socket)){myBlockingQueue.put(socket);}else if(null!=socket){socket.close();}Thread.sleep(50);}}if(myBlockingQueue.size()<2){//如果myBlockingQueue中socket数少于2个就会创建新的连接for(int i=0;i<3-myBlockingQueue.size();i++){socket = new Socket(IP,PORT);socket.setKeepAlive(true);//System.out.println("创建连接成功");if(!commonTool.isServerClose(socket)){myBlockingQueue.put(socket);System.out.println("创建连接成功,当前myBlockingQueue.size:"+myBlockingQueue.size()+";ListElement:"+myBlockingQueue.getListElement());}else{socket.close();}}}Thread.sleep(10000);} catch (Exception e) {//e.printStackTrace();}}}}
3、数据库端服务主查询:clientYWSS,用于接收转换端数据,查询并返回结果给转换端。
public class clientYWSS implements Runnable {PublicAppService publicAppService=new PublicAppService();CommonTool commonTool=new CommonTool();XmlEntity appxmlentity=new XmlEntity();private static Integer sotimeout=1*1*5000;//超时时间,以毫秒为单位private boolean close = false; // 关闭连接标志位,true表示关闭,false表示连接String ip;Integer port;Socket socket;MyBlockingQueue myBlockingQueue;public clientYWSS(String ip, Integer port, MyBlockingQueue myBlockingQueue) {super();this.ip = ip;this.port = port;this.myBlockingQueue=myBlockingQueue;init();}/*** 初始化socket对象*/public void init(){try {//InetAddress address = InetAddress.getByName(ip);System.out.println("YW端开启连接。。。");socket = new Socket(ip,port);socket.setKeepAlive(true);//开启保持活动状态的套接字//socket.setSoTimeout(sotimeout);//设置超时时间System.out.println("YW端开启连接。。。成功!");close=commonTool.isServerClose(socket);myBlockingQueue.put(socket);//加入线程安全队列}catch(Exception e){//e.printStackTrace();}}@Overridepublic void run() {Socket TempSocket;while(true){//---------读数据---------------------------TempSocket=myBlockingQueue.get();//while(commonTool.isServerClose(TempSocket)){if(null!=TempSocket){close = commonTool.isServerClose(TempSocket);//判断是否断开if(!close){//没有断开,开始读数据Message readMessage =commonTool.ReadText(TempSocket);if(null!=readMessage){System.out.println("YW读取数据:"+readMessage);appxmlentity=publicAppService.messageReceived(readMessage);//根据请求中请求码查询不同接口Message response =Message.createDefaultMessage(appxmlentity.buildAsBytes());System.out.println("YW端原始数据:"+response.toString());boolean b=commonTool.Send(TempSocket,response);if(b){System.out.println("业务端回复成功!");}}myBlockingQueue.put(TempSocket);TempSocket=null;}else{//---------创建连接-------------------------try{TempSocket.close();socket = new Socket(ip,port);socket.setKeepAlive(true);if(!commonTool.isServerClose(socket)){myBlockingQueue.put(socket);}else{socket.close();}System.out.println("建立连接成功:"+socket.getLocalAddress()+":"+socket.getLocalPort());*/}catch(Exception se){//System.out.println("创建连接失败:"+ip+":"+port);//close=true;}}}//}}}}
数据库端服务程序介绍完,下面一篇将介绍网站端部分代码。
转载于:https://my.oschina.net/czpdjx/blog/2249278
java多线程和长连接,三方转换通信的实践(2)——数据库端服务程序相关推荐
- java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法
很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接 ...
- java nio socket长连接_netty学习实战—实现websocket长连接和socket之间进程通信
netty学习-实现websocket长连接和socket之间通信 最近正在学习netty,跟着教程写了一个基于WebSocket的网页聊天室,对netty有了一定的了解,现在正好项目使用到长连接,选 ...
- java nio socket长连接_nio实现Socket长连接和心跳
前段时间用bio方式,也就是传统io实现了socket的长连接和心跳,总觉着服务端开启多线程管理socket连接的方式过于消耗资源,数据并发的情况下可能会影响到性能,因此就尝试使用nio改进原来的代码 ...
- java web tcp长连接超时时间_常用java web容器http长连接超时设置
1.http长连接相关知识 http长连接对我们来说并不陌生,但长连接并不是永远不会关闭.对于HTTP长连接需要注意下面几点:keepalive_timeout指的是web服务器发送完最后一个响应报文 ...
- java中字符和字节的转换_Java最佳实践–字符到字节和字节到字符的转换
java中字符和字节的转换 在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优. 特别是,我们将着重于使用默认编码时如何有效地处理字符到字节和字节到字符 ...
- (java)socket全双工长连接通信实例
(借鉴备忘)直接上代码: client: import java.io.InputStreamReader; import java.io.OutputStreamWriter; import jav ...
- java多线程三之线程协作与通信实例
多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition. ...
- java 服务器长链接_Java如何实现长连接
实现原理: 长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的. 如果,长时间未发送维持连接包,服务端程序将断开连接. 客户端: Client通过持有Socket的对象,可以随时(使 ...
- java前端长连接框架_Java如何实现长连接
实现原理: 长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的. 如果,长时间未发送维持连接包,服务端程序将断开连接. 客户端: Client通过持有Socket的对象,可以随时(使 ...
- java 长连接_Java如何实现长连接
实现原理: 长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的. 如果,长时间未发送维持连接包,服务端程序将断开连接. 客户端: Client通过持有Socket的对象,可以随时(使 ...
最新文章
- dockerfile常用命令
- 逻辑io 物理io oracle,Oracle体系结构之SQL语句的执行过程
- java pkcs#11读取证书加解密(初学-分享)
- Hystrix之Dashboard的常见问题
- 6.Xilinx RapidIO核仿真与包时序分析
- 在网上看到和篇关于sql server 2005的性能优化篇,觉得写得很好。
- 递归下降分析器的设计java_数据结构(Java版)教与学(48和60学时教学大纲)
- 我所理解的 C++ 反射机制
- JSK-118 输出格式练习【入门】
- 基于信息熵确立权重的topsis法_一种基于加权秩和比法的光伏并网逆变器多性能指标评价方法研究...
- Sql Server trace flags
- 一文解析SQLServer数据库
- 【测试工具】Selenium 自动化浏览器(Python 篇)
- 维修技术论坛专用工具包 v5.0
- Friendster,linkedin,orkut,liring对SNS的求索 1
- matplotlib画图使用微软雅黑字体
- TCP SYN握手报文可以传输数据吗
- 少年:Scala 学一下
- BGP多线和双线双IP服务器有什么区别? 哪个网站访问速度更快?
- Winmerge教程,包括可视化补丁,差异,合并示例