1. 程式人生 > >Java實現websocket 的兩種方法

Java實現websocket 的兩種方法

一.WebSocket簡單介紹

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

  我們知道,傳統的HTTP協議是無狀態的,每次請求(request)都要由客戶端(如 瀏覽器)主動發起,服務端進行處理後返回response結果,而服務端很難主動向客戶端傳送資料;這種客戶端是主動方,服務端是被動方的傳統Web模式 對於資訊變化不頻繁的Web應用來說造成的麻煩較小,而對於涉及實時資訊的Web應用卻帶來了很大的不便,如帶有即時通訊、實時資料、訂閱推送等功能的應 用。在WebSocket規範提出之前,開發人員若要實現這些實時性較強的功能,經常會使用折衷的解決方法:輪詢(polling)

Comet技術。其實後者本質上也是一種輪詢,只不過有所改進。

  輪詢是最原始的實現實時Web應用的解決方案。輪詢技術要求客戶端以設定的時間間隔週期性地向服務端傳送請求,頻繁地查詢是否有新的資料改動。明顯地,這種方法會導致過多不必要的請求,浪費流量和伺服器資源。

  Comet技術又可以分為長輪詢流技術長輪詢改進了上述的輪詢技術,減小了無用的請求。它會為某些資料設定過期時間,當資料過期後才會向服務端傳送請求;這種機制適合資料的改動不是特別頻繁的情況。流技術通常是指客戶端使用一個隱藏的視窗與服務端建立一個HTTP長連線,服務端會不斷更新連線狀態以保持HTTP長連線存活;這樣的話,服務端就可以通過這條長連線主動將資料傳送給客戶端;流技術在大併發環境下,可能會考驗到服務端的效能。

  這兩種技術都是基於請求-應答模式,都不算是真正意義上的實時技術;它們的每一次請求、應答,都浪費了一定流量在相同的頭部資訊上,並且開發複雜度也較大。

  伴隨著HTML5推出的WebSocket,真正實現了Web的實時通訊,使B/S模式具備了C/S模式的實時通訊能力。WebSocket的工作流程是這 樣的:瀏覽器通過JavaScript向服務端發出建立WebSocket連線的請求,在WebSocket連線建立成功後,客戶端和服務端就可以通過 TCP連線傳輸資料。因為WebSocket連線本質上是TCP連線,不需要每次傳輸都帶上重複的頭部資料,所以它的資料傳輸量比輪詢和Comet技術小 了很多。本文不詳細地介紹WebSocket規範,主要介紹下WebSocket在Java Web中的實現。

  JavaEE 7中出了JSR-356:Java API for WebSocket規範。不少Web容器,如Tomcat,Nginx,Jetty等都支援WebSocket。Tomcat從7.0.27開始支援 WebSocket,從7.0.47開始支援JSR-356,下面的Demo程式碼也是需要部署在Tomcat7.0.47以上的版本才能執行。

相關推薦

JAVA的執行緒物件實現方法

1.概述 執行緒不僅僅侷限於作業系統中,在程式設計語言、資料庫管理系統和其他的一些應用軟體中,也可以通過引入執行緒來改善系統和應用程式的效能。 在一個程序中包含多個並行執行的控制流,而不是把多個可併發執行的控制流一一分散在多個程序中,這是併發執行緒程式設計與併發多程序程式設計

MyBatis無限級分類實現方法--自關聯與map集合

except app exce utf-8 elf findall ldr ati tex 1、這回先創建數據庫吧 下表cid是CategoryId的縮寫,cname是CategoryName的縮寫,pid是parentId的縮寫 無限級分類一般都包含這三個屬性,至少也要包

關於匿名內部類實現方法

匿名內部類。這兩種方法都常用。 第一種方法Timer time= new Timer();time.schedule(new TimerTask() { @Override public void run() { // TODO Auto-gene

線程 實現方法

ble pac name runnable end extend 當前 ride xtend 1 package thread; 2 3 public class MyRunnable implements Runnable { 4 5 privat

unity透明視訊的實現方法

AR中常見的應用方式,在攝像機前播放部分透明的視訊,讓視訊和相機中的場景有所互動等應用方式。這次主要介紹特殊Shader的編寫和視訊的簡易製作,在Unity中不借助ARSDK開啟攝像頭,播放視訊達到簡易的AR的效果。 這邊平面和視訊有兩種不同方法實現。下面分別介紹。 一、視訊的處理(兩種方式

【LeetCode】1. Two Sum(數之和)-C++實現方法

本題是一下公司的面試題: 問題描述:   問題求解: 使用無序容器unorder_map實現: #include <iostream> #include <vector> #include <cassert> #inclu

移動端用rem實現 和 用jq實現方法

隨著現在移動端越來越方便,專案中移動端的web頁面也越來越多。除了用Bootstrap這種自適應的前端開發工具包,經常用到的就是rem佈局和jq實現兩種方法。rem結合了css3的media媒體查詢,同時我必須要說的是felx佈局,用起來真的覺得很方便。方便,方

Oracle中spool命令實現方法比較

要輸出符合要求格式的資料檔案只需在select時用字元連線來規範格式。比如有如下表 SQL>; select id,username,password from myuser;//測試表1 John       12342 Jack       123453 Rose       23454

spring AOP基礎(實現AOP方法

1.AOP的作用   在OOP中,正是這種分散在各處且與物件核心功能無關的程式碼(橫切程式碼)的存在,使得模組複用難度增加。AOP則將封裝好的物件剖開,找出其中對多個物件產生影響的公共行為,並將其封裝為一個可重用的模組,這個模組被命名為“切面”(Aspect),切面將那些與

Java 判斷閏年 方法

方法一: public class Bissextile { boolean bissextile(int year){ //建立boolean型別的方法 if(year % 4 == 0 && year % 100 != 0 || year % 4

java快速排序方法

public class FaskSort { private static int count0 = 0; public static void sort(int[] array){ if(array.length > 0){

劍指Offer面試題33:把陣列排成最小的數 Java 實現,三方法

題目:把陣列排成最小的數    輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這3個數字能排成的最小數字321323. 演算法分析: 1.最直接的辦法就是先求出這個陣列中所有數字

Spring+MyBatis整合、介面實現元件方法、整合流程

Spring+Mybatis mybatis-spring.jar整合包 MapperFactoryBean元件,封裝了根據Mapper對映器介面生成實現元件的功能 結合 先把包都引入 ioc aop dao dbcp 當然在之前的Mybatis下增

Android按鈕實現方法

剛接觸Android開發,第一篇部落格,也就當做筆記吧, 這裡先說一個問題,在很多Android開發書中可能是版本太早的問題,都說res/layout下有一個main.xml檔案中放著排版資訊,但是個人在實際中見到的是res/menu下是main.xml中只有少量其他資訊,

Java實現websocket方法

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

Java實現生產者消費者模式的方法

1、 利用 Object的 wait/notify,和非阻塞佇列實現 import java.util.PriorityQueue; public class Test{ private int size=10; private PriorityQueue&

Java實現變數交換的方法

方法一:引入第三方變數 public class ChangeVar{ public static void main(String[] args){ //交換變數 int a = 1; int b = 2; int c= a; //1 a = b;//2 b

Java——用方法實現字串逆序

package com.zth; public class Test{ public static String fun1(String str){ //方法一 將字串轉換為字元陣列 char[] arr = str.toCharA

Java實現記憶體可見性的方法比較:synchronized 和 Volatile以及涉及到鎖的剖析

這篇文中講述了通過synchronized和 volatile 變數實現記憶體可見性的方法,這裡比較下二者的區別。 * volatile 變數是一種稍弱的同步機制在訪問 volatile 變數時不會執行加鎖操作,因此也就不會使執行執行緒阻塞,因此 vola

Java併發:建立執行緒的方法:繼承Thread類和實現Runnable介面(一)

【1】瞭解程序與執行緒的概念 程序是一個程式在其自身的地址空間中執行一次活動,是資源申請、排程和獨立執行的單位。 執行緒是程序中的一個單一的連續控制流程,一個程序可以包含一個或多個執行緒。 如果要在