1. 程式人生 > >WebSocket實現簡單的即時通訊

WebSocket實現簡單的即時通訊

瀏覽器能夠與伺服器建立連線,通過已建立的通訊通道來發送和接收資料而不需要由HTTP協議引入額外其他的開銷來實現。

在本教程中我們將在Java EE環境下實現一個簡單的websockect伺服器端來和客戶端進行資料互動。

本教程需要以下環境:

  1. eclipse
  2. JDK8
  3. tomcat8
  4. Maven

pom.xml內容

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>me.gacl</groupId>
  <artifactId>JavaWebSocket</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>JavaWebSocket Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
      <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
      </dependency>
  </dependencies>
  <build>
    <finalName>JavaWebSocket</finalName>
  </build>
</project>
 

 1.WebSocket伺服器端

WebSocketTest.java

package me.gacl.websocket;

import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;

/**
 * @ServerEndpoint 註解是一個類層次的註解,它的功能主要是將目前的類定義成一個websocket伺服器端,
 * 註解的值將被用於監聽使用者連線的終端訪問URL地址,客戶端可以通過這個URL來連線到WebSocket伺服器端
 */
@ServerEndpoint("/myWebsocketTest")
public class WebSocketTest {
    //靜態變數,用來記錄當前線上連線數。應該把它設計成執行緒安全的。
    private static int onlineCount = 0;

    //concurrent包的執行緒安全Set,用來存放每個客戶端對應的MyWebSocket物件。若要實現服務端與單一客戶端通訊的話,可以使用Map來存放,其中Key可以為使用者標識
    private static CopyOnWriteArraySet<WebSocketTest> webSocketSet = new CopyOnWriteArraySet<WebSocketTest>();

    //與某個客戶端的連線會話,需要通過它來給客戶端傳送資料
    private Session session;

    /**
     * 連線建立成功呼叫的方法
     * @param session  可選的引數。session為與某個客戶端的連線會話,需要通過它來給客戶端傳送資料
     */
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        webSocketSet.add(this);     //加入set中
        addOnlineCount();           //線上數加1
        System.out.println("有新連線加入!當前線上人數為" + getOnlineCount());
    }

    /**
     * 連線關閉呼叫的方法
     */
    @OnClose
    public void onClose(){
        webSocketSet.remove(this);  //從set中刪除
        subOnlineCount();           //線上數減1
        System.out.println("有一連線關閉!當前線上人數為" + getOnlineCount());
    }

    /**
     * 收到客戶端訊息後呼叫的方法
     * @param message 客戶端傳送過來的訊息
     * @param session 可選的引數
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("來自客戶端的訊息:" + message);
        //群發訊息
        for(WebSocketTest item: webSocketSet){
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }
    }

    /**
     * 發生錯誤時呼叫
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error){
        System.out.println("發生錯誤");
        error.printStackTrace();
    }

    /**
     * 這個方法與上面幾個方法不一樣。沒有用註解,是根據自己需要新增的方法。
     * @param message
     * @throws IOException
     */
    public void sendMessage(String message) throws IOException{
        this.session.getBasicRemote().sendText(message);
        //this.session.getAsyncRemote().sendText(message);
    }

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        WebSocketTest.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        WebSocketTest.onlineCount--;
    }
}
2. 客戶端

<%@ page language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>Java後端WebSocket的Tomcat實現</title>
</head>
<body>
    Welcome<br/><input id="text" type="text"/>
    <button onclick="send()">傳送訊息</button>
    <hr/>
    <button onclick="closeWebSocket()">關閉WebSocket連線</button>
    <hr/>
    <div id="message"></div>
</body>

<script type="text/javascript">
    var websocket = null;
    //判斷當前瀏覽器是否支援WebSocket
    if ('WebSocket' in window) {

    ws://IP地址:埠號/專案名/@ServerEndpoint中的value值
      websocket = new WebSocket("ws://192.168.43.148:8080/JavaWebSocket/myWebsocketTest");

    }
    else {
        alert('當前瀏覽器 Not support websocket')
    }

    //連線發生錯誤的回撥方法
    websocket.onerror = function () {
        setMessageInnerHTML("WebSocket連線發生錯誤");
    };

    //連線成功建立的回撥方法
    websocket.onopen = function () {
        setMessageInnerHTML("WebSocket連線成功");
    }

    //接收到訊息的回撥方法
    websocket.onmessage = function (event) {
        setMessageInnerHTML(event.data);
    }

    //連線關閉的回撥方法
    websocket.onclose = function () {
        setMessageInnerHTML("WebSocket連線關閉");
    }

    //監聽視窗關閉事件,當視窗關閉時,主動去關閉websocket連線,防止連線還沒斷開就關閉視窗,server端會拋異常。
    window.onbeforeunload = function () {
        closeWebSocket();
    }

    //將訊息顯示在網頁上
    function setMessageInnerHTML(innerHTML) {
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }

    //關閉WebSocket連線
    function closeWebSocket() {
        websocket.close();
    }

    //傳送訊息
    function send() {
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
</script>
</html>

相關推薦

WebSocket實現簡單即時通訊

瀏覽器能夠與伺服器建立連線,通過已建立的通訊通道來發送和接收資料而不需要由HTTP協議引入額外其他的開銷來實現。 在本教程中我們將在Java EE環境下實現一個簡單的websockect伺服器端來和客戶端進行資料互動。 本教程需要以下環境: eclipse JDK8

websocket實現簡單聊天程序

spa nodejs end 地址 person focus data 實現 完成 程序的流程圖: 主要代碼: 服務端 app.js 先加載所需要的通信模塊: var express = require(‘express‘); var app = express();

websocket實現簡單的通信

clas continue app 線程 for 函數 ets catch solid websocket server端 #coding=utf8 #!/usr/bin/python import struct,socket import h

WebSocket實現web即時通信(後端nodejs實現)

tcp ica pri har == bootstra query gif 不容易 WebSocket實現web即時通信一、首先看一下,HTTP、ajax輪詢、long poll和WebSocket的區別:1、HTTP 協議(短連接):一個 Request 一個 Respo

flask + websocket實現簡單的單聊和群聊

單聊 from flask import Flask,request,render_template from geventwebsocket.handler import WebSocketHandler from gevent.pywsgi import WSGIServer fr

JavaScript WebSocket實現長連線通訊連線重連

JavaScript-JS依靠WebSoket也可以像其他語言一樣能夠實現通訊程式碼,不過使用的時候需要注意檢查連線斷開的情況。最基本的必須保證IP和埠都可以訪問。 目錄 WebSocket程式碼及測試 呼叫初始化程式碼 通訊示例程式碼 測試效果 WebSocket連線關

百度t7 課程, websocket 實現簡單聊天室

最簡單的聊天室,我寫了一個小時, 寫了10 分鐘,除錯50分鐘 因為 我是小菜鳥,不過凡事都有過程 index.html <!DOCTYPE html> <html lang="en"> <head> <meta c

使用cocoscreator + node.js + websocket實現簡單的聊天服務

先上個效果圖: 使用cocoscreator 1.9.1 + node.js + websocket實現,沒有使用socket.io, 全部自己封裝,長連線進行封裝後可以和短連線使用方法一樣,使用簡單,方便以後開發網路遊戲。 1、客戶端:   主要就是聊天內容的顯示,自動換行和背景擴充套件,程式碼大概如下:

websocket實現簡單聊天

上個月公司開發APP中用到了實時聊天功能,一開始覺得不可思議,因為完全沒有接觸過,然後聽安卓和ios的說之前的公司都是用第三方sdk的很少看到自己寫聊天功能的(南京大公司不多,我想大點的公司自己寫還是可以的,因為實現功能和商用還是有點區別的),老闆對我們的要求也不高,鼓勵我們

***Java中WebSocket實現簡單的聊天***

Java中WebSocket實現簡單的聊天 1 在pom.xml中新增Jar包依賴 <dependency> <groupId>org.springframework.boot</groupId> <arti

swoole實現IM即時通訊demo

通過使用swoole 實現IM即時通訊介面    這是服務端程式碼 im聊天介面請看http://swoole.zhouhao520.com/index.html   這個是我自己的伺服器,大家可以玩玩這個聊天場景; 前段頁面我是自己從網

一個基於webSocket實現前後端通訊的小demo

#sell 一般的web專案都是前臺向後臺傳送訊息,但是有些時候我們也需要從後端向前臺傳送訊息,比如說zfb的回撥資訊,微信的模板推送訊息等,下面通過Eclipse+Tomcat實現一個前後臺通訊的小demo; 先建立一個web專案  index.jsp寫一個簡單的頁面來

【tcp-ip學習總結】使用tcp協議實現簡單通訊小程式

環境:vs2013 server.c #include<Winsock2.h> #include<stdio.h> #pragma comment(lib,"Ws2_32.lib") #include<stdlib.h&

spring boot + webSocket 實現簡單會話與線上人數統計的demo

webSocket推送是常用於生產專案的模組,在我們部門做的一個彙報演示的demo中遇到了webSocket的一些問題。 自己下來看看了看webSocket的東西,結合spring boot 做了一個簡單的demo; 介紹的部分大家可以參考眾多的帖子,度娘 http://w

java WebSocket實現簡單的聊天室(包括群發和點對點聊天)

今天突然看到了WebSocket然後就網上找了一個例子,然後修改了下,實現了簡單的聊天室,包括群聊和點對點聊天。 使用的程式碼如下 jsp程式碼: <%@ page language="java" import="java.util.*" pageEncoding="

【Flask + WebSocket 實現簡單的聊天室】

群聊 後端程式碼 from flask import Flask, request, render_template from geventwebsocket.handler import WebSocketHandler from gevent.pywsgi import WS

SpringBoot WebSocket 實現簡單的聊天功能

前言 什麼是WebSocket WebSocket為瀏覽器和伺服器之間提供了雙工非同步通訊功能,也就是說我們可以利用瀏覽器給伺服器傳送訊息,伺服器也可以給瀏 覽器傳送訊息,目前主流瀏覽器的主流版本對WebSocket的支援都算是比較好的,但是在實際開發

利用websocket搭建網頁即時通訊(demo)

參考文章: 過一對一的通訊 過程中遇到的 問題 websocket中獲取httpsession : https://www.cnblogs.com/jarviswhj/p/4227559.html  本文中使用springboot搭建伺服器,上述連線中的類需要配置到s

spring websocket實現前後端通訊

  專案要用websocket實現一個前後端實時通訊的功能,做完之後感觸頗多,寫個部落格回顧下整個歷程,也希望能給後面的同志有點幫助。百度網盤示例原始碼:連結:https://pan.baidu.com/s/1Gi3qRyLO-lTnkVn4MqGIJA 密碼:4ovr我使用

基於websocket的網頁即時通訊(可傳附件圖片塗鴉、最小化狀態通知).NET,winform客戶端、服務端

公司網站需要即時通訊,就研究了下主要以下功能:websocket通訊,網頁端即時通訊,可以傳送表情,可以傳送附件,可以塗鴉,可以實現客服一對多聊天,winform做服務端負責收發,notification提醒,一番百度下來發現websocket做客戶端+superwebsoc