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 arg0) { if(null!=socketThread && !socketThread.isInterrupted()) { socketThread.closeSocketServer(); socketThread.interrupt(); } } @Override public void contextInitialized(ServletContextEvent arg0) { // 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(8877); 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)); 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) { // 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-8"); 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,<1年2班,小明>, 123241,#" + "\n").getBytes("utf-8")); 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 e1) { // TODO Auto-generated catch block e1.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("192.168.3.104",8877); PrintWriter os=new PrintWriter(socket.getOutputStream()); BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream())); int i=1; while(socket.isConnected()){ os.print("BEAT,12345678,160314,092832,1.00,123241,#"+"\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 - 基於Socket的多執行緒通訊Java執行緒
- java socket 通訊socketServer 服務端多執行緒JavaServer服務端執行緒
- Java多執行緒-執行緒通訊Java執行緒
- Java多執行緒學習——執行緒通訊Java執行緒
- Java多執行緒技術:實現多使用者服務端Socket通訊Java執行緒服務端
- java多執行緒5:執行緒間的通訊Java執行緒
- java多執行緒間的通訊Java執行緒
- Android Socket連線,使用Socket進行通訊(Android)Android
- java tcp 網路通訊--使用多執行緒傳輸檔案JavaTCP執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- Java多執行緒中的wait/notify通訊模式Java執行緒AI模式
- Java執行緒通訊Java執行緒
- java多執行緒實現TCP網路Socket程式設計(C/S通訊)Java執行緒TCP程式設計
- Java中的執行緒通訊詳解Java執行緒
- Java多執行緒/併發11、執行緒同步通訊:notify、waitJava執行緒AI
- Java之執行緒通訊Java執行緒
- 多執行緒之間通訊及執行緒池執行緒
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- java多執行緒:執行緒間通訊——生產者消費者模型Java執行緒模型
- 【Java】【多執行緒】兩個執行緒間的通訊、wait、notify、notifyAllJava執行緒AI
- 徹底明白Java的多執行緒-執行緒間的通訊(2)(轉)Java執行緒
- 徹底明白Java的多執行緒-執行緒間的通訊(1)(轉)Java執行緒
- java使用多執行緒Java執行緒
- 多執行緒之間的通訊執行緒
- Android小知識-Java多執行緒相關(執行緒間通訊)上篇AndroidJava執行緒
- Java 多執行緒學習(執行緒通訊——消費者和生產者)Java執行緒
- Java多執行緒學習(五)執行緒間通訊知識點補充Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- Java中快如閃電的執行緒間通訊Java執行緒
- Java中的多執行緒Java執行緒
- 多執行緒程式中對資料庫連線使用的疑問執行緒資料庫
- java多執行緒之執行緒的基本使用Java執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- 程式通訊 執行緒通訊執行緒
- 說說Java執行緒間通訊Java執行緒
- Java多執行緒——執行緒Java執行緒
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- JavaThread多執行緒同步、鎖、通訊Javathread執行緒