国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)

這篇具有很好參考價(jià)值的文章主要介紹了Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455,并由RFC7936補(bǔ)充規(guī)范。WebSocket API也被W3C定為標(biāo)準(zhǔn)。

WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。

廢話不多說(shuō):上才藝 ^_^

要實(shí)現(xiàn)聊天記錄的保存就要?jiǎng)?chuàng)建聊天記錄表

Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)

?建表語(yǔ)句

DROP TABLE IF EXISTS `user_message`;
CREATE TABLE `user_message`  (
  `from_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '發(fā)送人',
  `message` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '消息',
  `to_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接收人',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '日期'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

java引入依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>

配置類(lèi)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * @authoer:majinzhong
 * @Date: 2022/11/7
 * @description:
 */
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

controller類(lèi)

import com.shangfei.pojo.socket.SocketMsg;
import com.shangfei.response.WebResponse;
import com.shangfei.service.socket.WebSocketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

/**
 * @authoer:majinzhong
 * @Date: 2022/11/7

 * @Description: websocket的具體實(shí)現(xiàn)類(lèi)
 * 使用springboot的唯一區(qū)別是要@Component聲明下,而使用獨(dú)立容器是由容器自己管理websocket的,
 * 但在springboot中連容器都是spring管理的。
 * 雖然@Component默認(rèn)是單例模式的,但springboot還是會(huì)為每個(gè)websocket連接初始化一個(gè)bean,
 * 所以可以用一個(gè)靜態(tài)set保存起來(lái)。
 */

@RestController
public class WebSocketController {

    @Autowired
    WebSocketService webSocketService;

    /**
     * 打開(kāi)發(fā)送消息頁(yè)面
     * @return
     */
    @RequestMapping("/webSocketPage")
    public ModelAndView page(){
        return new ModelAndView("index");
    }

    /**
     * 獲得在線人信息
    * @return
     */
    @RequestMapping("/members")
    public WebResponse members(){
        return webSocketService.members();
    }

    /**
     * 查詢聊天記錄
     * @return
     */
    @RequestMapping("/message")
    public WebResponse message(@RequestBody SocketMsg socketMsg){
        return webSocketService.message(socketMsg);
    }

}

service類(lèi)

import cn.hutool.core.collection.CollectionUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.shangfei.mapper.plan.UserMapper;
import com.shangfei.mapper.socket.UserMessageMapper;
import com.shangfei.pojo.socket.SocketMsg;
import com.shangfei.pojo.socket.UserMessage;
import com.shangfei.response.WebResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.CrossOrigin;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @authoer:majinzhong
 * @Date: 2022/11/16
 * @description:
 */
@Component
@ServerEndpoint(value = "/websocket/{nickname}")
@CrossOrigin
@Service
public class WebSocketService {

    @Autowired
    UserMapper userMapper;

    private static UserMessageMapper userMessageMapper;

    @Autowired
    public void setLocationMapper(UserMessageMapper userMessageMapper) {
        WebSocketService.userMessageMapper = userMessageMapper;
    }

    /**
     * 新建list集合存儲(chǔ)數(shù)據(jù)
     */
    private static List<UserMessage> messageList = new ArrayList<>();
    /**
     * 設(shè)置一次性存儲(chǔ)數(shù)據(jù)的list的長(zhǎng)度為固定值,每當(dāng)list的長(zhǎng)度達(dá)到固定值時(shí),向數(shù)據(jù)庫(kù)存儲(chǔ)一次
     */
    private static final Integer LIST_SIZE = 5;
    /**
     * 用來(lái)存放每個(gè)客戶端對(duì)應(yīng)的MyWebSocket對(duì)象。
     **/
    private static CopyOnWriteArraySet<WebSocketService> webSocketSet = new CopyOnWriteArraySet<>();
    /**
     * 與某個(gè)客戶端的連接會(huì)話,需要通過(guò)它來(lái)給客戶端發(fā)送數(shù)據(jù)
     **/
    private Session session;
    /**
     * 用戶名稱
     **/
    private String nickname;
    /**
     * 用來(lái)記錄sessionId和該session進(jìn)行綁定
     **/
    private static Map<String,Session> map = new HashMap<String, Session>();

    /**
     * 查詢當(dāng)前在線人
     * @return
     */
    public WebResponse members(){
        Set<String> members = map.keySet();

        if(!CollectionUtil.isEmpty(members)) {
            List<Map<String,String>> userList=new ArrayList<>();
            for(String member:members){
                //通過(guò)工號(hào)查詢名字
                Map<String, String> user = userMapper.selectName(member);
                if(!CollectionUtil.isEmpty(user)){
                    userList.add(user);
                }else{
                    Map<String, String> userMap = new HashMap<>();
                    userMap.put("username",member);
                    userMap.put("name","");
                    userList.add(userMap);
                }
            }
            return WebResponse.success(userList);
        }else{
            return WebResponse.success(members);
        }
    }

    /**
     * 查詢聊天記錄
     * @param socketMsg
     * @return
     */
    public WebResponse message(SocketMsg socketMsg) {
        List<UserMessage> userMessageList=userMessageMapper.selectByType(socketMsg);
        return WebResponse.success(userMessageList);
    }

    /**
     * 連接建立成功調(diào)用的方法
     */
    @OnOpen
    public void onOpen(Session session,@PathParam("nickname") String nickname) {
        this.session = session;
        this.nickname=nickname;

        map.put(nickname, session);

        webSocketSet.add(this);
        System.out.println("有新連接加入:"+nickname+",當(dāng)前在線人數(shù)為" + webSocketSet.size());
        broadcast("人員更新");
    }

    /**
     * 連接關(guān)閉調(diào)用的方法
     */
    @OnClose
    public void onClose() {
        webSocketSet.remove(this);
        List<String> nickname = this.session.getRequestParameterMap().get("nickname");
        for(String nick:nickname) {
            map.remove(nick);
        }
        //當(dāng)有人退出連接時(shí),將集合里的信息保存到數(shù)據(jù)庫(kù)
        if(messageList.size()>0){
            userMessageMapper.insertMessageList(messageList);
            //清除集合
            messageList.clear();
        }
        broadcast("人員更新");
        System.out.println("有一連接關(guān)閉!當(dāng)前在線人數(shù)為" + webSocketSet.size());
    }

    /**
     * 收到客戶端消息后調(diào)用的方法
     */
    @OnMessage
    public void onMessage(String message, Session session,@PathParam("nickname") String nickname) {
        System.out.println("來(lái)自客戶端的消息-->"+nickname+": " + message);

        //從客戶端傳過(guò)來(lái)的數(shù)據(jù)是json數(shù)據(jù),所以這里使用jackson進(jìn)行轉(zhuǎn)換為SocketMsg對(duì)象,
        // 然后通過(guò)socketMsg的type進(jìn)行判斷是單聊還是群聊,進(jìn)行相應(yīng)的處理:
        ObjectMapper objectMapper = new ObjectMapper();
        SocketMsg socketMsg;

        try {
            socketMsg = objectMapper.readValue(message, SocketMsg.class);
            //將聊天記錄保存到數(shù)據(jù)庫(kù)
            UserMessage userMessage = new UserMessage();
            userMessage.setFromName(nickname);
            if(socketMsg.getType() == 1){
                userMessage.setToName(socketMsg.getToUser());
            }else{
                userMessage.setToName("all");
            }
            userMessage.setMessage(socketMsg.getMsg());
            userMessage.setCreateTime(new Date());
            messageList.add(userMessage);
            //當(dāng)集合里的數(shù)據(jù)已經(jīng)達(dá)到最大值,就將信息進(jìn)行保存
            if(messageList.size()==LIST_SIZE){
                userMessageMapper.insertMessageList(messageList);
                //清除集合
                messageList.clear();
            }
            //將賬號(hào)換成名字
            String name=userMessageMapper.getName(nickname);
            if(socketMsg.getType() == 1){
                //單聊.需要找到發(fā)送者和接受者.
                socketMsg.setFromUser(nickname);
                Session fromSession = map.get(socketMsg.getFromUser());
                Session toSession = map.get(socketMsg.getToUser());
                //將賬號(hào)換成名字
                String toName=userMessageMapper.getName(toSession.getPathParameters().get("nickname"));
                //發(fā)送給接受者.
                if(toSession != null){
                    //發(fā)送給發(fā)送者.
                    fromSession.getAsyncRemote().sendText(name+"->"+toName+":"+socketMsg.getMsg());
                    toSession.getAsyncRemote().sendText(name+"->"+toName+":"+socketMsg.getMsg());
                }else{
                    //發(fā)送給發(fā)送者.
                    fromSession.getAsyncRemote().sendText("系統(tǒng)消息:對(duì)方不在線或者您輸入的頻道號(hào)不對(duì)");
                }
            }else{
                //群發(fā)消息
                broadcast(name+": "+socketMsg.getMsg());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 發(fā)生錯(cuò)誤時(shí)調(diào)用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("發(fā)生錯(cuò)誤");
        error.printStackTrace();
    }

    /**
     * 群發(fā)自定義消息
     */
    public void broadcast(String message) {
        for (WebSocketService item : webSocketSet) {
            /**
             * 同步異步說(shuō)明參考:http://blog.csdn.net/who_is_xiaoming/article/details/53287691
             *
             * this.session.getBasicRemote().sendText(message);
             **/
            item.session.getAsyncRemote().sendText(message);
        }
    }
}

實(shí)體類(lèi)

import lombok.Data;

/**
 * @authoer:majinzhong
 * @Date: 2022/11/7
 * @description:
 */
@Data
public class SocketMsg {
    /**
     * 聊天類(lèi)型0:群聊,1:?jiǎn)瘟?     **/
    private int type;
    /**
     * 發(fā)送者
     **/
    private String fromUser;
    /**
     * 接受者
     **/
    private String toUser;
    /**
     * 消息
     **/
    private String msg;
}
import com.fasterxml.jackson.annotation.JsonFormat;

import java.util.Date;

public class UserMessage {
    private String fromName;

    private String message;

    private String toName;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    public String getFromName() {
        return fromName;
    }

    public void setFromName(String fromName) {
        this.fromName = fromName == null ? null : fromName.trim();
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message == null ? null : message.trim();
    }

    public String getToName() {
        return toName;
    }

    public void setToName(String toName) {
        this.toName = toName == null ? null : toName.trim();
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}

Vue代碼

<template>
  <el-dialog
    v-model="dialogVisible"
    title="聊天"
    width="70%"
    @close="closeWebSocket"
  >
    <div class="chat-big-box">
      <div class="chat-left">
        <el-collapse v-model="activeNames">
          <el-collapse-item  name="1" >
            <template #title>
              <div class="online-personnel user-select">
                <div>在線人員</div>
                <div class="sum">{{userArr.length>0?userArr.length-1:0}}人</div>
              </div>
            </template>
            <div class="chat-user-name user-select"
              v-for="(item,index) in userArr" :key="item.username"
              v-show="index>0"
              @click="checkUser(item)"
              :class="{'user-name-check':item.isCheck}">
              <div>員工名稱:</div>
              <div>{{item.name}}</div>
            </div>
          </el-collapse-item>
        </el-collapse>
      </div>
      <div class="chat-right">
        <div class="content" ref="smgContent">
          <div  v-for="item in msgArr" :key="item">{{item}}</div>
        </div>
        <div class="input-box">
          <el-input
            v-model="textarea"
            @keydown.enter="keydown"
            :autosize="{ minRows: 7, maxRows: 7 }"
            type="textarea"/>
          <el-button type="success"  size="large" plain @click="sendBtn" class="input-btn">發(fā)送</el-button>
        </div>
      </div>
    </div>
  </el-dialog>
</template>

<script setup>
import { ref, defineExpose, nextTick } from 'vue'
import axios from 'axios'

const dialogVisible = ref(false)
const smgContent = ref()
const textarea = ref('')
let chatWS = null
const userName= localStorage.getItem('userName')
let toUser = {id:null,name:null} // 要發(fā)送人的ID
const userArr = ref([]) // 人員數(shù)組
const activeNames = ref(['0'])
const msgArr = ref([])
// connectWebSocket()
function connectWebSocket () {
  // 判斷當(dāng)前瀏覽器是否支持WebSocket
  dialogVisible.value = true
  if ('WebSocket' in window) {
    // chatWS = new WebSocket('ws://172.16.26.37:8081/websocket/' + userName)
    chatWS = new WebSocket('ws://192.168.1.125:8080/websocket/' + userName)

  } else {
    alert('當(dāng)前瀏覽器不支持Websocket')
  }
  chatWS.onmessage = (evt) => {
    console.log(evt.data,'人員更新');
    if (evt.data==='人員更新') {
      obtainName() // 調(diào)取人員接口
    }else{
      msgArr.value.push(evt.data)
    }
    nextTick(()=>{
      smgContent.value.scrollTop = smgContent.value.scrollHeight
    })
  }
}

// 獲取聊天人員接口
function obtainName () {
  // axios.get('http://172.16.26.37:8002/java_backend/members').then(res => {
  axios.get('http://192.168.1.125:8080/members').then(res => {
    userArr.value = res.data.data.map(item => {
      item.isCheck = false
      if (toUser.id === item.username) {
        item.isCheck = true
      }
      return item
    })
  })
}

// 選擇群聊或者單聊  獲取聊天記錄
function checkUser (item) {
  msgArr.value = [] // 清空聊天框內(nèi)容
  userArr.value.forEach(i => {
    if (i.username !== item.username) {
      i.isCheck = false
    }
  })
  // 保存 選擇人員的ID和name 并通過(guò)id 來(lái)區(qū)分是群聊還是單聊
  item.isCheck = !item.isCheck
  toUser.name = item.name
  if (item.isCheck) {
    toUser.id = item.username
  } else {
    toUser.id = ''
  }
  let data = {
      type: toUser.id === '' ? 0 : 1,
      toUser:toUser.id,
      fromUser:userName
    }
  // 獲取聊天記錄
  axios.post('http://192.168.1.125:8080/message',data).then(res => {
    let type =toUser.id === '' ? true : false
    if (type) {
      res.data.data.forEach(item=>{
        msgArr.value.push(`${item.fromName}:${item.message}`) // 群聊
      })
    }else{
      res.data.data.forEach(item=>{
        msgArr.value.push(`${item.fromName}->${item.toName}:${item.message}`) //單聊
      })
    }
    nextTick(()=>{
      smgContent.value.scrollTop = smgContent.value.scrollHeight
    })
  })
}
// 發(fā)送消息
function keydown(e) {
  if (e.ctrlKey && e.keyCode === 13) {
    // 換行
    textarea.value = textarea.value + '\n'
  }
  if (e.ctrlKey === false && e.keyCode === 13) {
    // 阻止瀏覽器默認(rèn)行為  禁止發(fā)送時(shí)輸入框換行
    e.preventDefault ? e.preventDefault() : (e.returnValue = false);
    // 發(fā)送
    sendBtn()
  }
}

function sendBtn () {
  if (textarea.value !== '') {
    const socketMsg = {msg: textarea.value,toUser:toUser.id,type: toUser.id === '' ? 0 : 1}
    chatWS.send(JSON.stringify(socketMsg))
    textarea.value = ''
  }
}
// 關(guān)閉連接
function closeWebSocket () {
  chatWS.close()
  userArr.value = []
  textarea.value = ''
  msgArr.value = []
  dialogVisible.value = false
}
// 監(jiān)聽(tīng)窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時(shí),主動(dòng)去關(guān)閉websocket連接,防止連接還沒(méi)斷開(kāi)就關(guān)閉窗口,server端會(huì)拋異常。
window.onbeforeunload = function () {
  chatWS.close()
}
defineExpose({
  connectWebSocket
})
</script>
<style lang='css' scoped>

</style>
<style lang='less'>
.el-dialog__body{
  padding-top: 0px;
}

.chat-big-box{
  .user-select{
    user-select:none;
  }
  width: 100%;
  height: 60vh;
  display: flex;
  .chat-left{
    flex: 1;
    padding: 10px;
    border: solid 1px #ccc;
    overflow:auto;
    margin-right: 10px;
    .user-name-check{
      background: #ccc !important;
    }
    .chat-user-name{
      display: flex;
      padding: 10px;
      background: #dddadab4;
      line-height: 20px;
      margin-bottom: 5px;
      div:nth-child(1){
        margin-right: 10px;
      }
      div:nth-child(2){
        width: 150px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        text-align: left;
      }
    }
  }
  .chat-right{
    flex: 4;
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    align-items: center;
    position: relative;
    .content{
      border: solid 1px #ccc;
      width: 100%;
      height: 75%;
      text-align: left;
      overflow: auto;
      margin-bottom: 10px;
      div{
        margin: 10px;
      }
    }
    .input-box{
      width: 100%;
    }
    .input-btn{
      position: absolute;
      right: 1px;
      bottom: 1px;
    }
  }
  ::-webkit-scrollbar {
      width: 4px;
    }
  ::-webkit-scrollbar-thumb {
    /*滾動(dòng)條里面小方塊*/
    border-radius: 8px;
    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
    background: #4da1ff;
  }
  ::-webkit-scrollbar-track {
    /*滾動(dòng)條里面軌道*/
    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
    background: #ededed;
    border-radius: 8px;
  }
}
.online-personnel{
  width: 100%;
  display: flex;
  justify-content: space-between;
  padding: 10px;

  .sum{
    margin-right: 10px;
  }
}

</style>

對(duì)比:相較于之前的那篇博客添加了以下幾個(gè)點(diǎn):

Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)

?Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)

?Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)

?遇到問(wèn)題:相對(duì)于接口調(diào)用@Autowired會(huì)將對(duì)象加載進(jìn)容器,但是webSocket不是接口調(diào)用,所以在保存聊天記錄的時(shí)候會(huì)報(bào)空指針,(mapp對(duì)象的空指針)

所以要對(duì)mappr對(duì)象進(jìn)行提前加載,類(lèi)似于餓漢模式

Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)

之前:java實(shí)現(xiàn)聊天室(websocket)_奔馳的小野碼的博客-CSDN博客_java websocket聊天室文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-510298.html

到了這里,關(guān)于Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • WebSocket+Vue實(shí)現(xiàn)簡(jiǎn)易多人聊天室 以及 對(duì)異步調(diào)用的理解

    WebSocket+Vue實(shí)現(xiàn)簡(jiǎn)易多人聊天室 以及 對(duì)異步調(diào)用的理解

    代碼倉(cāng)庫(kù):github ??HTTP是不支持長(zhǎng)連接的,WebSocket是一種通信協(xié)議,提供了在單一、長(zhǎng)連接上進(jìn)行全雙工通信的方式。它被設(shè)計(jì)用于在Web瀏覽器和Web服務(wù)器之間實(shí)現(xiàn),但也可以用于任何需要實(shí)時(shí)通信的應(yīng)用程序。使用ws作為協(xié)議標(biāo)識(shí)符,如果需要加密則使用wss作為協(xié)議標(biāo)識(shí)符

    2024年01月17日
    瀏覽(25)
  • Vue + Element-Plus + SpringBoot + WebSocket實(shí)現(xiàn)簡(jiǎn)易網(wǎng)絡(luò)聊天室

    Vue + Element-Plus + SpringBoot + WebSocket實(shí)現(xiàn)簡(jiǎn)易網(wǎng)絡(luò)聊天室

    項(xiàng)目流程圖 1. 前端搭建: ? ? ? ? 前端用Vue+Element-Plus 來(lái)搭建,由登錄頁(yè)面和聊天頁(yè)面組成 1.1 登錄頁(yè)面 ? ? ? ? 由一個(gè)昵稱輸入框組成,用戶輸入自己的昵稱若昵稱和別的用戶不重復(fù),則可進(jìn)入聊天室,否則提示錯(cuò)誤并請(qǐng)重新輸入。 ????????這段代碼是一個(gè)Vue.js組件的

    2024年02月03日
    瀏覽(22)
  • 【你的第一個(gè)socket應(yīng)用】Vue3+Node實(shí)現(xiàn)一個(gè)WebSocket即時(shí)通訊聊天室

    【你的第一個(gè)socket應(yīng)用】Vue3+Node實(shí)現(xiàn)一個(gè)WebSocket即時(shí)通訊聊天室

    這篇文章主要是用WebSocket技術(shù)實(shí)現(xiàn)一個(gè) 即時(shí)通訊聊天室 ,首先先要了解為什么使用WebSocket而不是普通的HTTP協(xié)議,如果使用HTTP協(xié)議它是下面這種情況: 我發(fā)送一條消息,發(fā)送一個(gè)發(fā)送消息的請(qǐng)求;* 一直輪詢接收別人發(fā)送的消息,不管有沒(méi)有發(fā)送都要定時(shí)去調(diào)用接口。這里明

    2023年04月20日
    瀏覽(31)
  • 在線聊天室(Vue+Springboot+WebSocket)

    在線聊天室(Vue+Springboot+WebSocket)

    實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的在線聊天室的前后端。前端用Vue實(shí)現(xiàn),后端用Springboot實(shí)現(xiàn)。 ????????在線聊天室的功能包括創(chuàng)建用戶和顯示在線用戶列表、發(fā)送消息和顯示消息列表、用戶和消息列表實(shí)時(shí)更新這幾點(diǎn)。以下是整體功能的活動(dòng)圖: 用戶身份 ? ? ? ? 進(jìn)入聊天室的用戶需

    2024年01月15日
    瀏覽(28)
  • 基于SpringBoot+Vue+WebSocket的在線聊天室

    基于SpringBoot+Vue+WebSocket的在線聊天室

    WebSocket 是一種在 Web 應(yīng)用程序中實(shí)現(xiàn)雙向通信的協(xié)議。它提供了一種持久連接,允許客戶端和服務(wù)器之間進(jìn)行實(shí)時(shí)數(shù)據(jù)傳輸,而無(wú)需進(jìn)行頻繁的請(qǐng)求和響應(yīng)。 相對(duì)于傳統(tǒng)的 HTTP 請(qǐng)求-響應(yīng)模式,WebSocket 在客戶端和服務(wù)器之間建立起一條長(zhǎng)久的雙向通信通道。這意味著服務(wù)器可

    2024年01月16日
    瀏覽(41)
  • Vue+Nodejs 使用WebSocket創(chuàng)建一個(gè)簡(jiǎn)易聊天室

    Vue+Nodejs 使用WebSocket創(chuàng)建一個(gè)簡(jiǎn)易聊天室

    使用vue編寫(xiě)前端頁(yè)面,nodejs處理服務(wù)端消息,WebSocket進(jìn)行實(shí)時(shí)通信 1.客戶端 2. 服務(wù)端 使用的是nodejs

    2024年02月16日
    瀏覽(25)
  • Django實(shí)現(xiàn)websocket聊天室

    WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器雙向通信,即允許服務(wù)器主動(dòng)發(fā)送信息給客戶端。因此,在WebSocket中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸,客戶端和服務(wù)器之間的數(shù)據(jù)交換變

    2023年04月23日
    瀏覽(92)
  • QT聊天室階段性記錄(完善中:注冊(cè)功能,數(shù)據(jù)庫(kù)存儲(chǔ))
  • django websocket實(shí)現(xiàn)聊天室功能

    django websocket實(shí)現(xiàn)聊天室功能

    注意事項(xiàng)channel版本 django2.x 需要匹配安裝 channels 2 django3.x 需要匹配安裝 channels 3 Django 3.2.4 channels 3.0.3 Django 3.2.* channels 3.0.2 Django4.2 channles==3.0.5 是因?yàn)樽钚掳鎐hannels默認(rèn)不帶daphne服務(wù)器 直接用命令 python manage.py runsever 默認(rèn)運(yùn)行的是wsgi ,修改,刪除settings中的wsgi,都不能正確運(yùn)

    2024年01月22日
    瀏覽(27)
  • 【W(wǎng)ebSocket】SpringBoot整合WebSocket實(shí)現(xiàn)聊天室(一)

    【W(wǎng)ebSocket】SpringBoot整合WebSocket實(shí)現(xiàn)聊天室(一)

    目錄 一、準(zhǔn)備 1、引入依賴 2、創(chuàng)建配置類(lèi) 二、相關(guān)注解 首先我們需要在項(xiàng)目中引入依賴,有兩種方式。第一種我們可以在創(chuàng)建Spring Boot項(xiàng)目時(shí)搜索WebSocket然后勾選依賴 第二種是我們可以直接在項(xiàng)目的pom.xml文件中插入以下依賴 我們需要進(jìn)行如下配置 ServerEndpointExporter 是一個(gè)

    2024年02月13日
    瀏覽(92)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包