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.pswp.cn/news/539660.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539660.shtml
英文地址,請注明出處:http://en.pswp.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…