java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听。我们的应用场景是在java项目中,需要外接如一个硬件设备,通过tcp通信,获取设备传上来的数据,并对数据做回应。

先看一下web的监听代码:

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

public class AttendSocetListener implements ServletContextListener{

private SocketThread socketThread;

public void contextDestroyed(ServletContextEvent arg) {

if(null!=socketThread && !socketThread.isInterrupted())

{

socketThread.closeSocketServer();

socketThread.interrupt();

}

}

@Override

public void contextInitialized(ServletContextEvent arg) {

// TODO Auto-generated method stub

if(null==socketThread)

{

//新建线程类

socketThread=new SocketThread(null);

//启动线程

socketThread.start();

}

}

}

创建线程:

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.util.List;

public class SocketThread extends Thread

{

private ServerSocket serverSocket = null;

public SocketThread(ServerSocket serverScoket){

try {

if(null == serverSocket){

this.serverSocket = new ServerSocket();

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 t = new Thread(new SocketOperate(socket));

t.start();

}else{

break;

}

}catch (Exception e) {

System.out.println("SocketThread创建socket服务出错");

e.printStackTrace();

}

}

}

public void closeSocketServer(){

try {

if(null!=serverSocket && !serverSocket.isClosed())

{

serverSocket.close();

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

处理接受到的数据:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.Socket;

public class SocketOperate implements Runnable {

private Socket socket;

//该线程所处理的Socket所对应的输入流

BufferedReader br = null;

String str = null;

String content = null;

InputStreamReader reader=null;

public SocketOperate(Socket socket) throws IOException

{

this.socket = socket;

reader = new InputStreamReader(this.socket.getInputStream(),"utf-");

br = new BufferedReader(reader);

}

@Override

public void run()

{

try

{

// 采用循环不断从Socket中读取客户端发送过来的数据

while (true)

{

content = readFromClient();

System.out.println(content);

if (content == null)

{

break;

}

OutputStream os = socket.getOutputStream();

os.write(("RES, OK,, ,#" + "\n").getBytes("utf-"));

os.flush();

}

}

catch (IOException e)

{

e.printStackTrace();

}

}

//定义读取客户端数据的方法

private String readFromClient()

{

try

{

str = br.readLine();

return str;

}

//如果捕捉到异常,表明该Socket对应的客户端已经关闭

catch (IOException e)

{

try {

br.close();

reader.close();

socket.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

return null;

}

}

客户端代码:

package

import java.io.*;

import java.net.*;

public class TalkClient {

public static void main(String args[]) throws UnknownHostException, IOException {

Socket socket=new Socket("...",);

PrintWriter os=new PrintWriter(socket.getOutputStream());

BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

int i=;

while(socket.isConnected()){

os.print("BEAT,,,,.,,#"+"\n");

os.flush();

System.out.println("Client:"+i);

System.out.println("Server:"+is.readLine());

i++;

}

//继续循环

os.close(); //关闭Socket输出流

is.close(); //关闭Socket输入流

socket.close(); //关闭Socket

}

}

以上所述是小编给大家介绍的Java Web项目中使用Socket通信多线程、长连接的方法,希望对大家有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hadoop-eclipse-plugin使用

下载hadoop安装包:http://www.carfab.com/apachesoftware/hadoop/common/hadoop-1.0.2/ 但是没有plugin,我到这个地方下载的:http://ishare.iask.sina.com.cn/f/23642243.html?fromlikecopy到你的eclipse_home的plugins下面。配置map/reduce…

hadoop eclipse plugin windows下载集合

收集了hadoop稳定版本的eclipse plugin for windows。资源分一律为0分 hadoop-eclipse-plugin-1.2.1.jar http://download.csdn.net/detail/zengmingen/9488180 hadoop-eclipse-plugin-2.2.0.jar http://download.csdn.net/detail/zengmingen/9488182 hadoop-eclipse-pl…

java 记事本界面_JAVA/GUI程序之记事本

自上半年JAVA课程结束后,再也没有看过JAVA了,最近不是很忙,又简单的看了看,本博客纯属记录学习过程,请大神们别笑,其中错误是难免的,毕竟是新手写的博客。下面就进入我们的正题吧,复…

104. Maximum Depth of Binary Tree

104. Maximum Depth of Binary Tree 题目 Given a binary tree, find its maximum depth.The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 解析 // Maximum Depth of Binary Tree class Solution { publ…

mapper-reducer word count 实例

统计一个文件里各单词的个数,假设这个文件很大。 原理如下图: 编写代码: WCMapper.java package zengmg.hadoop.mr.wordcount;import java.io.IOException;import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; …

java 远程调用url_使用Java的URL/HttpURLConnection进行远程调用(POST请求)

利用Java的HttpURLConnection进行远程url请求(调用远程接口)测试类:请求类型为json,以post方式请求,利用OutputStream写入数据实体类:public class User implementsSerializable {privateString name;privateString password;publicString ge…

LindDotNetCore~职责链模式的应用

回到目录 职责链模式 它是一种设计模块,主要将操作流程与具体操作解耦,让每个操作都可以设置自己的操作流程,这对于工作流应用是一个不错的选择! 下面是官方标准的定义:责任链模式是一种设计模式。在责任链模式里&…

MR程序的几种提交运行模式

MR程序的几种提交运行模式 本地模型运行 1/在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行 ----配置path:D:\hadoop-2.7.2\bin ----配置hadoop_home:D:\hadoop-2.7.2 ----复制 hadoop.dll和winutil…

构件之法读书笔记04

我们前两周我们团队一起制作了一个大学生记账软件,但是我们没有对我们的软件进行测试,只要是这个功能能够顺利进行,我们就觉得OK。 其实,我认为我们的软件是有问题的,对于一些极限的操作能否完成,在各种环境…

零点起飞学java视频_零点起飞学java (刘升华) 高清PDF_IT教程网

资源名称:零点起飞学java (刘升华) 高清PDF第1篇 java开发基础第1章 java概述( 教学视频:37分钟) 2第2章 基本数据类型及运算( 教学视频:52分钟) 14第3章 java程序流程控制( 教学视频:33分钟) 36第4章 类与对…

【Spark】开发Spark选择Java还是Scala?

Spark-Java-Scala-哪种语言 spark java 支持_百度搜索(1 封私信)Spark 中用 Scala 和 java 开发有什么区别? - 知乎(1 封私信)Spark平台下,scala比java更有优势么? - 知乎

vector 修改 java_java对vector动态数组中的对象排序,以下代码有何问题,如何修改?...

展开全部package com.tx.collection;import java.util.Comparator;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;import java.util.TreeSet;import java.util.Vector;public class Student {String name;int score;public S…

hadoop的序列化与java的序列化区别

java的序列化机制 java序列化时会把具体类的数据和类的继承结构信息都序列化传递。如下图hadoop的序列化机制 序列化类的数据,但是不序列化类的继承结构信息。 网络传递的时候就少了很多流量,hadoop也不需要类的继承关系,只要类的数据就够…

java mail 已发送_JavaMail获取已发送邮件

public static voidmain(String args[]) {Properties props new Properties(); //参数配置props.setProperty("mail.transport.protocol", "smtp"); //使用的协议(JavaMail规范要求)props.setProperty("mail.smtp.host", "smtp.exmail.qq.c…

ORA-08103: object no longer exists

今天工具箱报错: ORA-08103: object no longer exists 查了原因,是有session在操作表,比如插入,更新等。而工具箱这个操作刚好在select表,所以报错。-------下文是英文解释----- ORA-08103: object no longer exists错…

【Spark】Spark-空RDD判断与处理

Spark-空RDD判断与处理 SparkKafkaDemo - Streaming Statisticsrdd isempty count_百度搜索Spark RDD.isEmpty costs much time - Stack OverflowSpark Streaming中空RDD的处理-Spark-about云开发[SPARK-5270] Provide isEmpty() function in RDD API - ASF JIRA19 Spark Stre…

JDBC开发步骤

JDBC开发步骤: 1、加载数据库驱动 2、通过DriverManager获取数据库连接Connection 3、通过Connection获取Statement/PreparedStatement 4、将SQL语句绑定到Statement/PreparedStatement中去,准备向数据库发送SQL语句 5、执行完sql语句后&#xff0c…

DAY3-“忙里偷闲”找你玩耍2018-1-11

接触Java第三天,嘿嘿,今天近代史期末考试,提前一小时交卷,回宿舍继续学习,中午去见女神姐姐了,每次见完女神姐姐都是满满地动力。这次女神姐姐告诉我们要好好规划自己的时间,早上花20分钟规划好…

java 数据保存内存_java中的各种数据类型在内存中存储的方式 一

1.java是如何管理内存的java的内存管理就是对象的分配和释放问题。(其中包括两部分)分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间。释放:对象的…

Gradle学习之构建java与web项目

一.使用Gradle的java插件构建Java项目 1)Gradle插件包含了若干个接口定义和已有的任务项,语法结构:apply plugin:插件名 ,此处我们定义插件 apply plugin : java 2)Gradle希望我们的java项目需要遵循以下规范: src/mai…