热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ServletContextListenersocket实现数据接收

ServletContextListenersocket实现数据接收通过创建ServletContextListener监听器,socket来实现tcpip协议客户端数据的接收功能

1.创建ServletContextListener 监听器


package com.chinalbs.common.utils;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;import org.springframework.web.context.support.WebApplicationContextUtils;import com.chinalbs.business.service.EnvironprotectRealtimeDataService;public class EquipmentSocetListener implements ServletContextListener {private SocketThread socketThread;@Overridepublic void contextInitialized(ServletContextEvent sce) {EnvironprotectRealtimeDataService erdService = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()).getBean(EnvironprotectRealtimeDataService.class);if (null == socketThread) {// 新建线程类socketThread = new SocketThread(null,erdService);// 启动线程socketThread.start();}}@Overridepublic void contextDestroyed(ServletContextEvent sce) {if (null != socketThread && !socketThread.isInterrupted()) {socketThread.closeSocketServer();socketThread.interrupt();}}}

erdService 是后面需要进行具体业务处理的service实例,SocketThread类是自定义的线程类

2.SocketThread线程类代码


package com.chinalbs.common.utils;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;import com.chinalbs.business.service.EnvironprotectRealtimeDataService;public class SocketThread extends Thread {private ServerSocket serverSocket = null;private static final int PORT = 9092;private EnvironprotectRealtimeDataService erdService;public SocketThread(ServerSocket serverScoket,EnvironprotectRealtimeDataService erdService) {this.erdService = erdService;try {if (null == serverSocket) {this.serverSocket = new ServerSocket(PORT);System.out.println("socket start");}} catch (Exception e) {System.out.println("SocketThread创建socket服务出错");e.printStackTrace();}}public void run() {while (true) {try {if (serverSocket == null) {break;} else if (serverSocket.isClosed()) {break;}Socket socket = serverSocket.accept();if (null != socket && !socket.isClosed()) {// 处理接收的数据Thread t1 = new Thread(new SocketOperate(socket,erdService));t1.start();} else {break;}} catch (Exception e) {System.out.println("SocketThread创建socket服务出错111111111111111111111111");e.printStackTrace();}}}public void closeSocketServer() {try {if (null != serverSocket && !serverSocket.isClosed()) {serverSocket.close();}} catch (IOException e) {e.printStackTrace();}}
}

SocketOperate是自定义的socket具体业务操作类

3.SocketOperate代码


package com.chinalbs.common.utils;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;import org.apache.commons.lang.ArrayUtils;import com.chinalbs.business.model.EnvironprotectRealtimeData;
import com.chinalbs.business.service.EnvironprotectRealtimeDataService;import net.sf.json.JSONObject;public class SocketOperate implements Runnable {private EnvironprotectRealtimeDataService erdService;private Socket socket;// 该线程所处理的Socket所对应的输入流BufferedReader br = null;String str = null;String cOntent= null;InputStreamReader reader = null;public SocketOperate(Socket socket,EnvironprotectRealtimeDataService erdService) throws IOException {this.socket = socket;this.erdService = erdService;reader = new InputStreamReader(this.socket.getInputStream(), "GBK");br = new BufferedReader(reader);}@Overridepublic void run() {try {// 采用循环不断从Socket中读取客户端发送过来的数据while (true) {cOntent= readFromClient();System.out.println(content);if (cOntent== null) {//重发,或者什么都不做break;}else{//验证接受到的信息是否正确,判断校验码是否一致//一致,响应信息,插入数据OutputStream os = socket.getOutputStream();String respOnseStr= dataHandler(content);os.write(responseStr.getBytes());os.flush();//不一致,重发或者什么都不做}}} catch (IOException e) {e.printStackTrace();}}//数据处理private String dataHandler(String data){//此处需要返回具体的应答数据,具体的数据格式,根据具体的业务要求}// 定义读取客户端数据的方法private String readFromClient() {try {str = br.readLine();return str;}// 如果捕捉到异常,表明该Socket对应的客户端已经关闭catch (IOException e) {try {br.close();reader.close();socket.close();} catch (IOException e1) {e1.printStackTrace();}}return null;}}

4.配置web.xml

5.将项目运行起来后可以查看器端口监听情况,这里监听的端口是9092,在window下,可以使用命令 netstat -aon|findstr "9092",在linux下可以使用命令netstat -tunlp|grep 9092

具体项目源码请参考https://download.csdn.net/download/jinxiumeihappy/12115422

 


推荐阅读
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有