SpringBoot 에서 웹 소켓 이 실시 간 채 팅 을 실현 합 니 다.

인 스 턴 트 채 팅
이것 은 웹 소켓 을 사 용 했 습 니 다.spring boot 에서 사용 하 는 것 은 간단 합 니 다.전단 은 애플 릿 입 니 다.이것 은 구덩이 입 니 다.애플 릿 이 실시 간 으로 채 팅 을 하려 면 도 메 인 이름 이 필요 하고 뉴스 프로 토 콜 을 사용 하 는 것 이 뉴스+ssl 이 더욱 안전 합 니 다.그러나 온라인 에 접속 하려 면 아직 부족 합 니 다.기업 주체 개발 자 를 위해 야 합 니 다.개인 개발 자 실시 간 채 팅 은 사교 에 속 하고 서비스 유형 에 없 으 며 심 사 는 통과 되 지 않 습 니 다!!
기능:우리 의 애플 릿 은 중고 거래 애플 릿 입 니 다.인 스 턴 트 채 팅 은 백 스테이지 서버 가 단일 핵 2g 일 뿐 저항 할 수 없습니다.그래서 쌍방 이 모두 온라인 에 있 을 때 채 팅 메 시 지 를 저장 하지 않 고 일방적으로 온라인 에 없 을 때 오프라인 메 시 지 를 저장 했다.그리고 세 가지 오프라인 메시지 만 보 낼 수 있 습 니 다.csdn 의 채 팅 을 모방 하 였 습 니 다.
사용:저 희 는 채 팅 에 들 어가 기 를 클릭 한 후에 웹 소켓 을 시작 합 니 다.이것 은 문제 가 되 었 습 니 다.바로 사용자 가 메시지 목록 에서 종료 하고 다시 들 어가 면 웹 소켓 요청 을 다시 보 내 는 것 입 니 다.매번 세 션 을 요청 할 때마다 다르다.그리고 위 챗 은 한 사용자 가 동시에 5 개의 요청 을 할 수 있 도록 제한 합 니 다.처음부터 채 팅 페이지 를 종료 하지 못 하고 시작 하 는 것 이 잘못 되 었 습 니 다!!................................................백 스테이지 에서 만 끊 을 수 있 습 니 다.근 데 나중에 전단 이 스스로 끊 어 지면 나 이 스!
효과:
在这里插入图片描述
在这里插入图片描述
데이터베이스 디자인:
메시지 메 신 저 목록 을 보 여 주 는 데 시 계 를 사 용 했 습 니 다.last_context 가 상대방 에 게 보 낸 마지막 메시지 입 니 다.한 쪽 이 메 시 지 를 클릭 하고 채 팅 페이지 에 들 어가 면 표 에 두 개의 기록 을 삽입 합 니 다.편리 한 후에 채 팅 을 삭제 합 니 다.한 쪽 이 삭제 하면 다른 쪽 도 정 보 를 볼 수 없 기 때 문 입 니 다.
在这里插入图片描述
메시지 의 상세 한 오프라인 내용 에 대해 서 는 다른 표를 사용 했다.
在这里插入图片描述
배경 코드:

package com.w.wx.controller.WebSocket;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.w.wx.domain.ChatMessage;
import com.w.wx.service.ChatService;
import com.w.wx.utils.ALToHMUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

@Slf4j
@ServerEndpoint("/wx/{fromOpenid}/{toOpenid}")
@Component
public class WebSocketServer {

    public static WebSocketServer webSocketServer;
    @Autowired
    private ChatService chatService;

    @PostConstruct        //       bean     
    private void init() {
        webSocketServer = this;
        //         interFaceInfoMapper      
        webSocketServer.chatService = this.chatService;
    }


	 //    ,           。            。
    private static AtomicInteger onlineNum = new AtomicInteger();

    //concurrent      HashMap,            WebSocketServer  。
    private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();

    //    
    public void sendMessage(Session session, ChatMessage message) throws IOException {
        if(session != null){
            synchronized (session) {

                String s = JSONObject.toJSONString(message);
                System.out.println("52     :" + s);
                session.getBasicRemote().sendText(s);
            }
        }
    }
    //         
    public void sendInfo(String to_openid, ChatMessage message){
        Session session = sessionPools.get(to_openid);

        if(session == null){
            webSocketServer.chatService.addDeInfo(message);
        }else{
            try {
                sendMessage(session, message);
            }catch (Exception e){
                e.printStackTrace();
            }
        }


    }
    //     
    public void broadcast(ChatMessage message){
    	for (Session session: sessionPools.values()) {
            try {
                sendMessage(session, message);
            } catch(Exception e){
                e.printStackTrace();
                continue;
            }
        }
    }



    //        ,      username          
    // to=-1    
    @OnMessage
    public void onMessage(String message) throws IOException{
        ChatMessage msg=JSON.parseObject(message, ChatMessage.class);
        sessionPools.get(msg.getToOpenid());

        webSocketServer.chatService.addInfo(message);


        if (msg.getToOpenid().equals("-1")) {
            broadcast(msg);
        } else {
            sendInfo(msg.getToOpenid(),msg);
        }

    }



    //        
    @OnOpen
    public void onOpen(Session session, @PathParam(value = "fromOpenid") String fromOpenid,@PathParam(value = "toOpenid") String toOpenid) throws IOException {

        ArrayList<ChatMessage> list = webSocketServer.chatService.getAllNotRead(fromOpenid,toOpenid);
        if (!list.isEmpty()) {
            Iterator<ChatMessage> it = list.iterator();
            while (it.hasNext()) {
                ChatMessage chatMessage = it.next();
                chatMessage.setContent(ALToHMUtil.toUnicode(chatMessage.getContent()));
                sendMessage(session, chatMessage);
                log.info("115           " + chatMessage.toString());
            }
        }

        sessionPools.put(fromOpenid, session);

        addOnlineCount();
        System.out.println("125 "+fromOpenid + "  webSocket!     " + onlineNum);


    }

    //       
    @OnClose
    public void onClose(@PathParam(value = "fromOpenid") String fromOpenid) throws IOException {

        Session session = sessionPools.get(fromOpenid);

        session.close();
        sessionPools.remove(fromOpenid);

        subOnlineCount();
        System.out.println(fromOpenid + "  webSocket  !     " + onlineNum);

    }
    //     
    @OnError
    public void onError(Session session, Throwable throwable){
       // System.out.println("    ");
        throwable.printStackTrace();
    }

    public static void addOnlineCount(){
        onlineNum.incrementAndGet();
    }

    public static void subOnlineCount() {
        onlineNum.decrementAndGet();
    }
    
    public static AtomicInteger getOnlineNumber() {
        return onlineNum;
    }
    
    public static ConcurrentHashMap<String, Session> getSessionPools() {
        return sessionPools;
    }
}
SpringBoot 에서 webSocket 이 실시 간 채 팅 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 SpringBoot 에서 webSocket 이 실시 간 채 팅 을 실현 하 는 것 에 관 한 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기