1. 程式人生 > >JavaWeb--使用Websocket實現線上聊天功能

JavaWeb--使用Websocket實現線上聊天功能

package websocket.chat;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;

import com.chat.common.HTMLFilter;
import com.chat.controller.UserDAOImpl;
import com.chat.entity.User;

@ServerEndpoint(value = "/index.jsp",configurator=GetHttpSessionConfigurator.class)
public class ChatAnnotation {
	private static final Log log = LogFactory.getLog(ChatAnnotation.class);
    private static final Map<String, ChatAnnotation> connection = new HashMap<String, ChatAnnotation>();
    private String userId;
    private String nickname;
    private Session session;
    public ChatAnnotation() {
    }
    @OnOpen
    public void start(Session session,EndpointConfig config) {
      //獲取HttpSession物件
       HttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
       User user = (User)httpSession.getAttribute("user");
       String uid = user.getId();
       this.nickname = user.getUsername();
       this.userId = uid;
       
       this.session = session;
        /*判斷連結是否已經在連結佇列中,存在就不加*/
       if(!connection.containsKey(uid)){
    	   connection.put(uid, this);
    	   String message = "* 你已經連結";
    	   toConfirmFriend(message,userId);
       }
    }
    @OnClose
    public void end() {
        connection.remove(this.userId);
    }
    @OnMessage
    public void incoming(String message){
    	String[] all = message.split("-");
    	//要接收訊息好友的ID
    	String uid = all[1];
    	//判斷好友的連線是否存在,不存在就提示好友掉線
    	if(connection.containsKey(uid)){
    		 String filteredMessage = String.format("%s: %s",
    	                nickname, HTMLFilter.filter(all[0].toString()));
    	        sendCommonRecord(filteredMessage,uid,this.userId);
    	}else{
    		ChatAnnotation client = connection.get(uid);
    		 String mes = String.format("* %s %s",
                     client.nickname, "已經掉線!");
    		//將掉線資訊發給自己
    		 toConfirmFriend(mes,this.userId);
    	}
    }
    @OnError
    public void onError(Throwable t) throws Throwable {
        log.error("Chat Error: " + t.toString(), t);
    }
    //傳送給指定的好友
    private static void toConfirmFriend(String msg,String uid) {
        ChatAnnotation client = connection.get(uid);
        try {
            synchronized (client) {
                client.session.getBasicRemote().sendText(msg);
            }
        } catch (IOException e) {
            log.debug("Chat Error: Failed to send message to "+client.nickname, e);
            try {
                client.session.close();
            } catch (IOException e1) {
                // Ignore
            }
        }
    }
    //給聊天的雙發發共同訊息
    private static void sendCommonRecord(String msg,String sid,String gid) {
        ChatAnnotation client_send = connection.get(sid);
        ChatAnnotation client_get = connection.get(gid);
        try {
            synchronized (client_send) {
            	client_send.session.getBasicRemote().sendText(msg);
            }
            //將這條聊天記錄儲存在資料庫
            UserDAOImpl userDAOImpl = new UserDAOImpl();
            userDAOImpl.saveCharRecord(msg, sid, gid);
        } catch (IOException e) {
            log.debug("Chat Error: Failed to send message to "+client_send.nickname, e);
            connection.remove(sid);
            try {
            	client_send.session.close();
            }catch (IOException e1) {
                // Ignore
            }
        }
        try {
            synchronized (client_get) {
            	client_get.session.getBasicRemote().sendText(msg);
            }
        } catch (IOException e) {
            log.debug("Chat Error: Failed to send message to "+client_get.nickname, e);
            connection.remove(gid);
            try {
            	client_get.session.close();
            } catch (IOException e1) {
                // Ignore
            }
        }
    }
}

這是後臺程式碼,使用註解方式監聽前臺的事件

相關推薦

JavaWeb--使用Websocket實現線上聊天功能

package websocket.chat; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; import javax.web

基於vue,websocket實現線上聊天功能

    最近專案中一直在使用vue作為前端框架,可是用到的只有很少一部分的功能,特別是vuex,為了更加深入瞭解vue框架,在工作之餘開發了一款基於vue的線上聊天工具,一下是部分功能效果圖1.登入註冊2.新增好友&國際化3.訊息重發歡迎star

SSH 項目中 使用websocket 實現網頁聊天功能

發送 ref asi action 監聽器 remote static scrollto 連接 參考文章 :java使用websocket,並且獲取HttpSession,源碼分析 http://www.cnblogs.com/zhuxiaojie/p/623882

websocket實現實時聊天功能

最近想實現網頁版的仿QQ聊天工具,本來想用ajax實現的,但是一想到要一直輪詢,就感覺有點蠢。後來在網上找到了websocket相關的資料,就拿來跟大家分享下(不是很熟練,現在只實現了群聊,單聊的前端不會寫了。但可以跟大家說說思路)。 伺服器端程式碼: 首先要建

SpringBoot+WebSocket實現線上聊天(一)

線上聊天功能是為了方便HR快速交流,由於HR人數有限,因此這裡並未考慮高併發問題,小夥伴思考問題一定要結合上下文環境。OK,我們先來看看效果圖: 線上聊天效果圖 登陸成功後,點選右上角的鬧鈴圖示,進入到訊息頁面,點選 好友聊天 選項卡,效果如下:

WebSocket實現線上聊天及常見BUG解決[圖文詳解]

前言        最近在開發時碰到這樣一個需求:使用者瀏覽我們的官網時,存在一個問題反饋的入口,當管理員在PC端的時候可以直接回復,當管理員不在的時候,進行微信推送,管理員在微信端和客戶進行一對一的線上問題解答,由於這個功能塊的收益客戶較小,最終技術選型採用WebSock

php+websocket實現線上聊天室(二)

上一篇部落格我們完成了服務端的基本結構,這一篇部落格我們就來把它豐富起來以實現聊天室的功能。 1.整理需求 1.進行三人隨機匹配 2.取消匹配 3.傳送訊息 4.離開房間 5.獲取當前線上人數 2.規定訊息格式 我們使用json來傳遞

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

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

基於flask框架,使用websocket實現一對一聊天功能

info app lan 提示 function _id 數據 sca 響應 後端代碼: from flask import Flask,request,render_template from geventwebsocket.handler import WebSock

javaweb實現線上支付功能

1、線上支付概述什麼是線上支付呢?沒錯,就是在網上花錢!大家一定有過這樣的經歷。但是你可能不太瞭解線上支付的“內情”,下面我們來了解一下!如果你現在開始經營一個電子商務網站,使用者買了東西一定要支付,你的網站一定要可以連線各大銀行了,然後在各大銀行支付完成後,再返回到你的網站

websocket實現簡單聊天程序

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

websocket 實現實時重新整理功能

<script> export default { data() { return { websock: null }; }, methods: { initWebSocket() { var backUrlarr = this

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

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

Django + WebSocket + Redis 線上聊天室題文章

話不多說先上效果圖演示 專案:http://112.74.164.107:9990/ 1、安裝組建 redis: yum install redis/apt install redis 2、建立虛擬化環境並進入 python3/python -m venv venv source venv\bin

SSM框架+WebSocket實現網頁聊天(Spring+SpringMVC+MyBatis+WebSocket

建站不止於增刪改查,還有很多很有魅力的地方。對於通訊聊天這塊已經青睞好久了,前段時間在做的j2ee專案運用到Spring+SpringMVC+MyBatis的框架集合,是關於一個社交平臺的網站,類似於facebook,twitter,微博等。在做完基本的CURD(例如評論模組

websocket原理與聊天功能

  前段時間剛好要做一個小型的網頁版聊天室,需求是用電腦完成語音通話(前面部落格有),傳送圖片/文字/檔案什麼的。這就涉及到的網頁套接字,在這裡就不得不說一下的的WebSocket的原理 首先,可將網頁套接字是HTML5出的東西(協議),也可以理解的WebSocket的是一

websocket實現簡單聊天

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

socket實現簡易聊天功能

最近在看網路程式設計這一塊 小有收貨 分享一哈  希望可以幫到有需要的人 編碼開始  功能實現類如圖 client :主要模擬客戶端 傳送訊息  server :服務端 serverHandler :服務端業務處理類 Test :測試類 1:首先開始寫 Se

基於Tomcate、java、websocket 簡單線上聊天

基於Tomcate、java、websocket 簡單線上聊天 前言 一直以來對於這個線上聊天有很大興趣,但是一直沒有學習入口,可能也是因為工作原因,沒精力去深究這玩意,前段時間為了瞭解這個socket,還專門看了幾章TCP/IP協議,想說稍微瞭解瞭解,後來沒堅持兩天,

環信實現基本聊天功能

用環信實現基本的聊天功能: 1、先到官網下載官方的demo:http://www.easemob.com/download/im 2、新建一個工程,然後將下面幾個檔案加到libs 裡面,沒有這個檔案的可以在app下新建一個。 3、配置資訊 在清單檔案 AndroidMan