天天看點

php h5實作聊天室,html5中關于socket.io實作一個聊天室的示例代碼

html5中關于socket.io實作一個聊天室的示例代碼

1

.user{

color:lightskyblue;

cursor: pointer;

}

歡迎來老王聊天室

發送

線上使用者

線上人數 0

let txtMsg = document.querySelector('#txtMsg');

let onlineUsers = document.querySelector('#onlineUsers');

//此腳本會在window上增加一個io的屬性

//http://localhost:8080/=/=空

let socket = io();

//當用戶端連接配接伺服器成功之後,向背景發送一個消息,問一下現在有哪些線上使用者

socket.on('connect',function(){

socket.emit('users');

});

let messageUl = document.querySelector('#messageUl');

let userUl = document.querySelector('#userUl');

//監聽伺服器發過來的消息

socket.on('message',function(msgObj){

let li = document.createElement('li');

li.className = 'list-group-item';

li.innerHTML = `${msgObj.username}:${msgObj.content} ${new Date(msgObj.createAt).toLocaleString()}`;

messageUl.appendChild(li);

});

socket.on('userList',function(userList){

userUl.innerHTML = userList.map(item=>(

`

${item}`

)).join('');

countUser();

});

socket.on('user-added',function(username){

let li = document.createElement('li');

li.className = 'list-group-item';

li.innerHTML = `${username}`;

userUl.appendChild(li);

countUser();

});

function countUser(){

onlineUsers.innerHTML = `線上人數 ${userUl.children.length}`;

}

//發送事件

function send(){

let content = txtMsg.value;//先拿到聊天的内容

socket.send(content);

txtMsg.value = '';

}

function handleKeyDown(event){

if(event.keyCode == 13)

send();

}

//給父級綁定點選事件 事件委托

//要判斷點的是span而非别的元素

userUl.addEventListener('click',function(event){

//如果事件源的類名是user的話

if(event.target.className == 'user'){

let username = event.target.innerHTML;

txtMsg.value = `@${username} `;

}

})

背景nodelet express = require('express');

let path = require('path');

let app = express();

app.get('/',function(req,res){

res.sendFile(path.resolve('index.html'));

});

let server = require('http').createServer(app);

//socket.io是依賴http伺服器

let io = require('socket.io')(server);

//聲明一個對象,儲存所有的用戶端使用者名和它們的socket對應關系

let clients = {};

//監聽用戶端的連接配接,當連接配接到來的時候執行此回調函數

io.on('connection',function(socket){

//在函數的内部聲明一個變量,叫username

let username;

//監聽用戶端的發過來的消息,當消息發過來的時候執行回調函數

socket.on('message',function(data){

if(username){

//判斷是公聊還是私聊

let reg = /@([^ ]+) (.+)/;

let result = data.match(reg);

if(result){//如果result有值則比對上了

//此處是私聊

let toUser = result[1];

let content = result[2];

clients[toUser] && clients[toUser].send({

username,

content,

createAt:new Date()

});

}else{//沒比對上

//正常發言,向所有的用戶端進行廣播

io.emit('message',{

username,content:data,createAt:new Date()

});

}

}else{

username = data;//把這個消息當成使用者名

//關聯起來

clients[username]= socket;

//向所有的用戶端廣播說有新的使用者加入聊天室

io.emit('message',{

username:'系統',content:`歡迎 ${username} 加入聊天室`,createAt:new Date()

});

//事件的名字可以自定義

io.emit('user-added',username);

}

});

//監聽用戶端發過來的請求,把使用者數組傳回

socket.on('users',function(){

let userList = Object.keys(clients);

socket.emit('userList',userList);

});

});

server.listen(8080);