首先是node代碼:
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.urlencoded({ extended: false }))
const server = require('http').createServer(app);
const io = require('socket.io')(server);
// 登陸介面
app.post('/login', (req, res) => {
console.log(req.body)
let { name, password } = req.body
if (name === 'admin') {
if (password === 'admin') {
res.json({ code: 200, msg: '驗證通過' })
} else {
res.json({ code: 500, msg: '密碼錯誤' })
}
} else {
res.json({ code: 500, msg: '用戶名錯誤' })
}
})
const lsit = ['仁義道德,也是一種奢侈', '時間不在于你擁有多少,而在于你怎樣使用', '放馬過來吧!你會死的很光榮的', '念當年有愛的我,可惜啊,你們看不到啦',
'即使一無所有,也要未雨綢繆', '落葉的一生,只是為了歸根么', '千軍萬馬一將在,探囊取物有何難', '順我者昌,逆我者亡,此乃天意', '我可以想去哪就去哪,但是我只想進入你的心里',
'我寧愿犯錯誤,也不愿什么都不做', '不要測驗你的運氣,召喚師', '死亡如風,常伴吾身', '我在時光中穿梭,只為找回曾經美好的時光'
]
// websocket
io.on('connection', (socket) => {
// 向客戶端發送訊息
socket.emit('msg', {
name: '服務端',
content: '你好,歡迎使用Socket.io'
})
// 向所有客戶端發送訊息
io.emit('broadcast',/* */)
socket.on('msg', (msg) => {
console.log(lsit[Math.floor(Math.random() * lsit.length)])
setTimeout(() => {
socket.emit(msg.type, {
name: '服務端',
content: lsit[Math.floor(Math.random() * lsit.length)]
})
}, 500)
})
});
app.use(express.static(`${__dirname}/static`))
app.get('/', function (req, res) {
res.sendFile(`${__dirname}/index.html`)
})
app.get('*', function (req, res) {
res.send('Hello World')
})
server.listen(3000)
其次是html:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 上述3個meta標簽*必須*放在最前面,任何其他內容都*必須*跟隨其后! --> <title>聊天室</title> <!-- Bootstrap --> <link href="css/bootstrap.min.css" rel="stylesheet"> <!-- HTML5 shim 和 Respond.js 是為了讓 IE8 支持 HTML5 元素和媒體查詢(media queries)功能 --> <!-- 警告:通過 file:// 協議(就是直接將 html 頁面拖拽到瀏覽器中)訪問頁面時 Respond.js 不起作用 --> <!--[if lt IE 9]> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/html5shiv.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dest/respond.min.js"></script> <![endif]--> </head> <body> <div class="container"> <h1 style="text-align: center;">express+socket.io聊天室</h1> <style> #showLog { display: block; } </style> <!-- 登陸 --> <div class="row" id="showLog"> <div class="col-md-12"> <div class="form-group"> <label for="userId">賬號</label> <!-- admin --> <input type="text" class="form-control" id="userId" value="admin" placeholder="輸入賬號"> </div> <div class="form-group"> <label for="password">密碼</label> <!-- admin --> <input type="password" class="form-control" id="password" value="admin" placeholder="輸入密碼"> </div> <button id="login" class="btn btn-success">登陸</button> </div> </div> <style> #showCon { display: none; height: 650px; background: url('img/backgroundimg.jpg') center no-repeat; background-size: cover; border: 2px solid #ccc; border-radius: 10px; overflow-y: auto; } .alert { padding: 8px; } .left { text-align: left; } .right { text-align: right; } </style> <!-- 聊天室 --> <div class="row" id="showCon"> <div class="col-md-12"> <!-- 左側接收別人訊息 --> <!-- <div > <p><span >張三</span></p> <p><span >hajdhjahdajdhajsdhjahdjadhjadhj</span></p> </div> --> <!-- 右側自己訊息 --> <!-- <div > <p><span >張三</span></p> <p><span >hajdhjahdajdhajsdhjahdjadhjadhj</span></p> </div> --> </div> </div> <div style="display: none;" id="hideTxt"> <div class="form-group row"> <label for="cont">輸入想要發送的訊息</label> <textarea class="form-control col-md-12" id="cont" onkeydown="if(event.keyCode==13){event.keyCode=0;event.returnValue=https://www.cnblogs.com/myan/p/false;}"></textarea> </div> <button style="float: right;" class="btn btn-success" onclick="btnSend()">發送</button> </div> </div> <!-- 模態提示框 --> <div class="modal fade" tabindex="-1" role="dialog" id="myModal"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> <h4 class="modal-title">提示</h4> </div> <div class="modal-body"> <p id="modal"></p> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">關閉</button> </div> </div><!-- /.modal-content --> </div><!-- /.modal-dialog --> </div><!-- /.modal --> <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依賴 jQuery,所以必須放在前邊) --> <script src="js/jquery.min.js"></script> <!-- 加載 Bootstrap 的所有 JavaScript 插件,你也可以根據需要只加載單個插件, --> <script src="js/bootstrap.min.js"></script> <script src="/socket.io/socket.io.js"></script> <script> var content = $('#showCon .col-md-12'); var socket = null; // 登陸 $('#login').click(() => { var userId = $('#userId').val() var password = $('#password').val() if (userId && password) { $.ajax({ url: 'http://localhost:3000/login', type: 'post', data: { name: userId, password }, success(res) { if (res.code === 200) { $('#showLog').hide() $("#showCon,#hideTxt").show() socket = io('ws://localhost:3000'); socket.on('connect', function () { console.log('建立連接'); }); socket.on('msg', function (data) { console.log(data) content.append(` <div class="left"> <p><span class="label label-warning">${data.name}</span></p> <p><span class="alert alert-warning">${data.content}</span></p> </div> `) scro() }); socket.on('disconnect', function () { console.log('斷開連接'); }); } } }) } else { $('#myModal').modal('show') $('#modal').text('請輸入正確的賬號或密碼') } }) // 發送訊息到服務端 // socket.emit('msg', '哈哈哈啊哈') function btnSend() { var txt = $('#cont').val() if (!txt) { $('#myModal').modal('show') $('#modal').text('請輸入內容') return; } else { socket.emit('msg', { name: 'admin', content: txt, type: 'msg' }) content.append(` <div class="right"> <p><span class="label label-success">admin</span></p> <p><span class="alert alert-success">${txt}</span></p> </div>` ) $('#cont').val('') scro() } } // 滾動條已知在底部 function scro() { var scr = document.querySelector('#showCon') scr.scrollTop = scr.scrollHeight; } window.onkeydown = (e) => { var theCode = e || window.event if (theCode.keyCode === 13) { btnSend() } } </script> </body> </html>
然后有一些npm包,我把package.json里面內容拿過來,方便安裝依賴
{ "name": "socketIo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "bootstrap": "^3.4.1", "express": "^4.17.1", "socket.io": "^2.3.0" } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/21685.html
標籤:JavaScript
