首頁 php教程 PHP开发 HTML5基於Tomcat 7.0實現WebSocket連接並實現簡單的即時聊天

HTML5基於Tomcat 7.0實現WebSocket連接並實現簡單的即時聊天

Dec 08, 2016 pm 01:37 PM
html5

1、什麼是WebSocket?

WebSocket 是一種自然的全雙工、雙向、單套接字連接。使用WebSocket,你的HTTP 請求變成開啟WebSocket 連線(WebSocket 或WebSocket over TLS(TransportLayer Security,傳輸層安全性,原稱「SSL」))的單一請求,並且重複使用從客戶端到伺服器以及伺服器到客戶端的同一連接。 WebSocket 減少了延遲,因為一旦建立起WebSocket 連接,伺服器可以在訊息可用時發送它們。例如,和輪詢不同,WebSocket只發出一個請求。伺服器不需要等待來自客戶端的請求。相似地,客戶端可以在任何時候向伺服器發送訊息。相較於輪詢不管是否有可用訊息,每隔一段時間都發送一個請求,單一請求大大減少了延遲。

2、WebSocket API

WebSocket API 讓你可以透過Web,在客戶端應用程式和伺服器端進程之間建立全雙工的雙向通訊。 WebSocket 介面規定了可用於客戶端的方法以及客戶端與網路的互動方式。 

3、WebSocket建構子

為了建立到伺服器的WebSocket連接,使用WebSocket接口,透過指向一個代表所要連接端點的URL,實例化一個WebSocket物件。 WebSocket 協定定義了兩種URL方案(URL scheme)—ws和wss,分別用於客戶端和伺服器之間的非加密與加密流量。

實例:var ws = new WebSocket("ws://www.websocket.org");

4、WebSocket事件

WebSocket API 是純事件驅動的。應用程式程式碼監聽WebSocket物件上的事件,以便處理輸入資料和連線狀態的改變。 WebSocket協定也是事件驅動的。

WebSocket物件調度4個不同的事件:

A、open事件:

一旦伺服器回應了WebSocket連線請求,open事件觸發並建立一個連線。 open事件對應的回呼函數稱為onopen

實例:

ws.onopen = function(e) {
console.log("Connection open...");
};
登入後複製

   

B、messagess事件: 

message事件在接收到訊息時觸發事件對應於訊息的回調。 

實例:

ws.onmessage = function(e) {
if(typeof e.data === "string"){
console.log("String message received", e, e.data);
} else {
console.log("Other message received", e, e.data);
}
};
登入後複製

   

C、error事件:

error 事件在響應意外故障的時候觸發。與該事件對應的回呼函數為onerror。 
實例:

ws.onerror = function(e){
console.log('websocked error');
handerError();
}
登入後複製

   

D、close事件:

close 事件在WebSocket 連線關閉時觸發。對應close 事件的回呼函數是onclose。

實例:

ws.onclose = function(e) {
console.log("Connection closed", e);
};
登入後複製

   

5、WebSocket方法

WebSocket 物件有兩種方法:send() 和close()。

A、 send() 方法:

使用WebSocket在客戶端和伺服器之間建立全雙工雙向連線後,就可以在連線開啟時呼叫send() 方法。使用send() 方法可以從客戶端向伺服器發送訊息。在發送一條或多條訊息之後,可以保持連線打開,或是呼叫close() 方法終止連線。

實例:

ws.send("Hello WebSocket!");
登入後複製

   

B、close ()方法:

使用close()方法,可以關閉WebSocket連線或連線嘗試。如果連線已經關閉,該方法就什麼都不做。在呼叫close()之後,不能在已經關閉的WebSocket上傳送任何資料。可以向close()方法傳遞兩個可選參數:code(數字型的狀態代碼)和reason(一個文字字串)。傳遞這些參數能夠向伺服器傳遞關於客戶關閉連線原因的資訊。

註:以上是對WebSocket的簡單介紹,以下將用一個簡單的網頁實時聊天案例來介紹如何使用WebSocket

A:首先新建一個項目我這裡叫chatroom,在建一個包然後新建一個類用於實作伺服器端的連線我的類別稱為ChatWebSocketServlet.Java;

具體專案建置如下圖: 

 

B:寫伺服器端實作類別ChatWebSocketServlet.java,具體程式碼:實作前台頁面index.jsp(為了展示功能並沒有美化,比較簡陋)具體程式碼如下:

package com.yc.chat.Servlet;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
@WebServlet("/chat")
public class ChatWebSocketServlet extends WebSocketServlet {
private final Map<Integer, WsOutbound> map = new HashMap<Integer, WsOutbound>();
private static final long serialVersionUID = -1058445282919079067L;
@Override
protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest request) {
// StreamInbound:基于流的WebSocket实现类(带内流),应用程序应当扩展这个类并实现其抽象方法onBinaryData和onTextData。
return new ChatMessageInbound();
}
class ChatMessageInbound extends MessageInbound {
// MessageInbound:基于消息的WebSocket实现类(带内消息),应用程序应当扩展这个类并实现其抽象方法onBinaryMessage和onTextMessage。
@Override
protected void onOpen(WsOutbound outbound) {
map.put(outbound.hashCode(), outbound);
super.onOpen(outbound);
}
@Override
protected void onClose(int status) {
map.remove(getWsOutbound().hashCode());
super.onClose(status);
}
@Override
protected void onBinaryMessage(ByteBuffer buffer) throws IOException {
}
@Override
protected void onTextMessage(CharBuffer buffer) throws IOException {
String msg = buffer.toString();
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
msg = " <font color=green>匿名用戶 " + sdf.format(date) + "</font><br/> " + msg;
broadcast(msg);
}
private void broadcast(String msg) {
Set<Integer> set = map.keySet();
for (Integer integer : set) {
WsOutbound outbound = map.get(integer);
CharBuffer buffer = CharBuffer.wrap(msg);
try {
outbound.writeTextMessage(buffer);
outbound.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
登入後複製

   

這樣簡單的即時聊天頁面就做好了,接下來將專案部署到Tomcat 7.0伺服器,並開啟伺服器就可以實現聊天了

結果展示:

1.在網址列輸入伺服器位址:

http://127.0.0.1:8080/chatroom/index.jsp

點擊連線伺服器結果如下:

2.分別在兩個不同的瀏覽器打開並互相發送訊息(我這裡用谷歌和火狐)結果如下: 

HTML5基於Tomcat 7.0實現WebSocket連接並實現簡單的即時聊天

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

See all articles