1. 程式人生 > >java實現websocket,前臺都後臺demo

java實現websocket,前臺都後臺demo

下文的簡潔程式碼即建立了一個 WebSocket 的服務端,@ServerEndpoint("/echo")註釋端點表示將 WebSocket 服務端執行在 ws://[Server 端 IP 或域名]:[Server 埠]/websockets/echo 的訪問端點,

客戶端瀏覽器已經可以對 WebSocket 客戶端 API 發起 HTTP 長連線了。

使用 ServerEndpoint 註釋的類必須有一個公共的無引數建構函式

@onMessage 註解的 Java 方法用於接收傳入的 WebSocket 資訊,這個資訊可以是文字格式,也可以是二進位制格式。
OnOpen 在這個端點一個新的連線建立時被呼叫。引數提供了連線的另一端的更多細節。Session 表明兩個 WebSocket 端點對話連線的另一端,可以理解為類似 HTTPSession 的概念。
OnClose 在連線被終止時呼叫。引數 closeReason 可封裝更多細節,如為什麼一個 WebSocket 連線關閉。
更高階的定製如 @Message 註釋,MaxMessageSize 屬性可以被用來定義訊息位元組最大限制,在示例程式中,如果超過 6 個位元組的資訊被接收,就報告錯誤和連線關閉。
maven配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
服務端程式碼:
import java.io.IOException;
import java.io.InputStream;


import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;


@ServerEndpoint("/echo")//這裡的註解在springboot中需要宣告一個config類
public class WebSocketHandle {
	
	private Process process;
	private InputStream inputStream;
	
	/**
	 * 新的WebSocket請求開啟
	 */
	@OnOpen
	public void onOpen(Session session) {
		try {
			// 執行tail -f命令
			process = Runtime.getRuntime().exec("tail -f /var/log/syslog");
			inputStream = process.getInputStream();
			
			// 一定要啟動新的執行緒,防止InputStream阻塞處理WebSocket的執行緒
			TailLogThread thread = new TailLogThread(inputStream, session);
			thread.start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * WebSocket請求關閉
	 */
	@OnClose
	public void onClose() {
		try {
			if(inputStream != null)
				inputStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		if(process != null)
			process.destroy();
	}
	
	@OnError
	public void onError(Throwable thr) {
		thr.printStackTrace();
	}
}
config類:
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}
處理訊息的執行緒:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


import javax.websocket.Session;


public class TailLogThread extends Thread {
	
	private BufferedReader reader;
	private Session session;
	
	public TailLogThread(InputStream in, Session session) {
		this.reader = new BufferedReader(new InputStreamReader(in));
		this.session = session;
		
	}
	
	@Override
	public void run() {
		String line;
		try {
			while((line = reader.readLine()) != null) {
				// 將實時日誌通過WebSocket傳送給客戶端,給每一行新增一個HTML換行
				session.getBasicRemote().sendText(line + "<br>");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


當 Browser 和 WebSocketServer 連線成功後,會觸發 onopen 訊息;如果連線失敗,傳送、接收資料失敗或者處理資料出現錯誤,
browser 會觸發 onerror 訊息;當 Browser 接收到 WebSocketServer 傳送過來的資料時,就會觸發 onmessage 訊息,引數 evt 
中包含 Server 傳輸過來的資料;當 Browser 接收到 WebSocketServer 端傳送的關閉連線請求時,就會觸發 onclose 訊息。
我們可以看出所有的操作都是採用非同步回撥的方式觸發,這樣不會阻塞 UI,可以獲得更快的響應時間,更好的使用者體驗
web端程式碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>tail log</title>
</head>
<body>
	<div id="log-container" style="height: 450px; overflow-y: scroll; background: #aaa; color: #aaa; padding: 10px;">
		<div>
		</div>
	</div>
    <script type="text/jscript" src="./jquery-3.3.1.min.js"></script>
<script>
	$(document).ready(function() {
		// 指定websocket路徑
		var websocket = new WebSocket('ws://localhost:8080/echo');
		websocket.onmessage = function(event) {
			// 接收服務端的實時日誌並新增到HTML頁面中
			$("#log-container div").append(event.data);
			// 滾動條滾動到最低部
			$("#log-container").scrollTop($("#log-container div").height() - $("#log-container").height());
		};
	});
</script>
</body>
</html>


相關推薦

java實現websocket前臺後臺demo

下文的簡潔程式碼即建立了一個 WebSocket 的服務端,@ServerEndpoint("/echo")註釋端點表示將 WebSocket 服務端執行在 ws://[Server 端 IP 或域名]:[Server 埠]/websockets/echo 的訪問端點,客戶端

【木木與呆呆的專欄】Java程式設計師專注Java程式設計技術開發以後臺為主前臺為輔目前投身Hadoop大資料以及Ranger安全開發活躍在大資料開源社群同時推薦多種高效便捷的開發工具分享自己的各種經驗技巧總結。

Java程式設計師,專注Java程式設計技術,開發以後臺為主前臺為輔,目前投身Hadoop大資料以及Ranger安全開發,活躍在大資料開源社群,同時推薦多種高效便捷的開發工具,分享自己的各種經驗技巧總結。...

java實現websocket 終極指南

CA sys 攔截 tex ebo encoding ++ RKE UNC 1、pom中添加依賴 <dependency> <groupId>org.springframework</groupId>

四、Netty實現webSocket實現伺服器與瀏覽器(HTML)線上聊天功能

        由於http協議有一個缺陷:通訊只能由客戶端發起。如果伺服器有連續的狀態變化,客戶端要獲知只能使用"輪詢":每隔一段時候,就發出一個詢問,瞭解伺服器有沒有新的資訊。輪詢的效率低,非常浪費資源(因為必須不停連線,或者 HTTP 連線始終開啟)

java實現爬蟲爬取網易歌單資訊

之前一直對爬蟲很好奇,覺得它很神祕,而我有個朋友是做爬蟲的,最近有空就向他學習了一下,並試著寫了個小程式。 首先是獲得httpclient物件及httpresponse物件,此兩者是用於傳送請求及接受資料。 CloseableHttpClient httpClient

小程式與java實現websocket通訊

1.websocket類 /** * @ServerEndpoint 註解是一個類層次的註解,它的功能主要是將目前的類定義成一個websocket伺服器端, * 註解的值將被用於監聽使用者連線的終端訪問URL地址,客戶端可以通過這個URL來連線到WebSocket伺服器端 */ @Serv

java實現順序二分分塊查詢

二分查詢表一定要有序 下面是具體實現程式碼 import java.util.*; public class search { //順序查詢 public static int seqsearch(int[]a,int keytype){ if(a.length>0

Java實現websocket與微信小程式連線

微信的WebSocket介面和HTML5的WebSocket基本一樣,是HTTP協議升級來的,做為一個新的Socket在B/S上使用,它實現了瀏覽器與伺服器全雙工通訊。   在WebSocket出來之前,實現即時通訊通常使用Ajax來實現,而Ajax是通過輪詢的方式進行實時資料的獲

Java 實現佇列

package base.structure; /** * @program: Algorithm4J * @description: 實現一個Stack * @author: Mr.Dai * @create: 2018-12-06 15:25 **/ public cla

通過Java實現HMAC將字串雜湊成為全部由字母組成的密文串

以下Java程式碼可以將任何字串通過HMAC雜湊,並輸出成由大寫的A到P組成的密文字串。 public class HMAC { private final static String KEY_MAC = "HMACMD5"; /** * 全域性陣列 *

## java實現支付寶掃碼支付Demo原始碼

java實現支付寶掃碼支付Demo原始碼 掃碼效果圖 做這個非常非常的困難,經歷了很多很多坑後才能做出來,在這裡貼一下相關的程式碼希望能幫助做支付開發的同事們,有不懂的問題可以諮詢我QQ76949433,提供技術解答 專案結構截圖: package com.

JAVA實現websocket

什麼是websocket? 傳統的通訊模式是這樣的:客戶端(瀏覽器等)主動向伺服器傳送一個請求,伺服器接收之後,處理這個請求,然後返回一個響應給客戶端。大多數都是客戶端向伺服器傳送請求,而伺服器很難主動向客戶端傳送資料。 websocket實現了瀏覽器與伺服器的全雙工通訊,使服務

Jquery EasyUI +Ajax +Json +一般處理程式 實現資料的前臺後臺的互動 --- 善良公社專案

經過上一篇部落格,本節主要是來看實現的功能是後臺的資料通過json資料傳過來,前臺修改的資料再傳回資料庫之後頁面再次更新table中的資料;  圖示: 例項:前臺的程式碼 <%--表格顯示區--%> <table id="tt" " ti

ssm框架下前臺後臺的資料互動

ssm框架下,js頁面通過json將資料傳送到後臺,後臺處理之後,再將資料傳送到前臺。 在前臺,要將使用者名稱和郵箱傳送到後臺,先將使用者名稱和和郵箱轉成json形式的資料,在通過ajax傳送到後臺,其中url為後臺要處理資料的地址。前臺主要程式碼如下,其中User是一個實

Kafka 使用Java實現資料的生產和消費demo

前言 在上一篇中講述如何搭建kafka叢集,本篇則講述如何簡單的使用 kafka 。不過在使用kafka的時候,還是應該簡單的瞭解下kafka。 Kafka的介紹 Kafka是一種高吞吐量的分散式釋出訂閱訊息系統,它可以處理消費者規模的網站中的所有動作流資

Java實現websocket 的兩種方法

一.WebSocket簡單介紹  隨著網際網路的發展,傳統的HTTP協議已經很難滿足Web應用日益複雜的需求了。近年來,隨著HTML5的誕生,WebSocket協議被提出,它實現了瀏覽器與伺服器的全雙工通訊,擴充套件了瀏覽器與服務端的通訊功能,使服務端也能主動向客戶端傳送資料。  我們知道,傳統的HTTP協議

[演算法入門]快速排序非遞迴方法(Java實現大家一起來找茬啊~

基礎 總結一下,快速排序的步驟: 1、找到一個key值(就是陣列第一個值),先從右到左找,找到一個比它小的值,記錄下標。 2、然後從左往右找,找到一個比它大的值,記錄下標。 3、交換找到的兩個數

java實現Stringdatetimestamp相互轉換

一、Timestamp轉化為String:SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//定義格式,不顯示毫秒T

NodeJS實現WebSocket太容易了吧!!

我們基於express和socket.io開發,首先我們需要安裝以下包 npm install --save express npm install --save socket.io 伺服器端程式碼

ID3演算法的java實現(轉載修改)

    決策樹是以例項為基礎的歸納學習演算法。它從一組無次序、無規則的元組中推理出決策樹表示形式的分類規則。它採用自頂向下的遞迴方式,在決策樹的內部結點進行屬性值的比較,並根據不同的屬性值從該結點向下分支,葉結點是要學習劃分的類。從根到葉結點的一條路徑就對應著一條合取