SpringBoot 에서 웹 소켓 이 실시 간 채 팅 을 실현 합 니 다.
7430 단어 SpringBootwebSocket인 스 턴 트 채 팅
이것 은 웹 소켓 을 사 용 했 습 니 다.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 이 실시 간 채 팅 을 실현 하 는 것 에 관 한 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.