<script src="https://cdn.socket.io/4.6.0/socket.io.min.js" integrity="sha384-c79GN5VsunZvi+Q/WObgk2in0CbZsHnjEqvFxC5DxHn9lTfNce2WW6h2pH6u/kF+" crossorigin="anonymous"></script>
const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
http.listen(8001, () => {
console.log('Server Open : ', 8001);
});
//클라이언트 소켓 생성 후 연결
let socket = io.connect();
socket.on('connect', ()=>{
console.log('server connected');
})
// 클라이언트 소켓ㅇ과 연결이 되고 새로 생성된 소켓
io.on("connection", (socket) => {
console.log("sever socket connected");
socket.on("disconnect", () =>{
console.log("server socket disconnected");
});
});
💡 socket 함수
socket.emit : 전송한 클라이언트에게만 메시지 전송
io.emit : 서버에 접속된 모든 클라이언트에게 메시지를 전송
socket.on('connect', () => {
console.log('server connected');
socket.emit('username', username); //username이라는 이벤트에 메시지 보내기
});
//info라는 이벤트 메시지 받기
socket.on('info', (socketID) => {
my_id = socketID;
});
//notice라는 이벤트 메시지 받기
socket.on('notice', (msg) => {
const container = document.querySelector('.container');
const div = document.createElement('div');
div.classList.add('notice');
div.textContent = msg;
container.appendChild(div);
console.log(container);
});
//newMsg 라는 이벤트메시지를 받기
socket.on('newMsg', (json) => {
//json = {msg : ~~~}
const container = document.querySelector('.container');
const outer_div = document.createElement('div');
const div = document.createElement('div');
let msg = '';
if (json.from === my_id) {
if (json.is_dm) {
outer_div.classList.add('dm', 'my-dm');
} else {
outer_div.classList.add('my-chat');
}
msg = json.msg;
}
else {
if (json.is_dm) {
outer_div.classList.add('dm', 'other-dm');
} else {
outer_div.classList.add('other-chat');
}
msg = json.username + ' : ' + json.msg;
}
div.textContent = msg;
outer_div.appendChild(div);
container.appendChild(outer_div);
});
//list 라는 이벤트메시지를 받기
socket.on('list', (list) => {
const member_list = document.getElementById('members');
//null이 아니면 계속 마지막요소 지워주기
while (member_list.firstChild)
member_list.removeChild(member_list.lastChild);
const option = document.createElement('option');
option.text = '전체';
option.value = '전체';
member_list.appendChild(option);
console.log(Object.entries(list));
for (let [key, value] of Object.entries(list)) {
if (key !== my_id) {
const option = document.createElement('option');
option.text = value;
option.value = value;
member_list.appendChild(option);
}
}
});
/*전송 이벤트*/
const btnSend = () => {
const input = document.getElementById('msg_box');
const to = document.getElementById('members').value;
socket.emit('send', { msg: input.value, to }); //send 라는 이벤트메시지 보내기
input.value = '';
};
const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
//{소켓아이디 : 닉네임, ...}
let list = {};
//connect 라는 전체 이벤트메시지 받기
io.on('connection', (socket) => {
console.log('Server Socket Connected');
//info 라는 이벤트 보내기
socket.emit('info', socket.id);
//username 라는 이벤트메시지 받기
socket.on('username', (name) => {
list[socket.id] = name;
io.emit('list', list); //list 라는 전체 이벤트메시지 보내기
io.emit('notice', name + '님이 입장하셨습니다');//notice 라는 전체 이벤트메시지 보내기
});
//send 라는 이벤트메시지 받기
socket.on('send', (json) => {
//json = { msg : ~~}
json['from'] = socket.id;
json['username'] = list[socket.id];
json['is_dm'] = false;
if (json.to === '전체') {
io.emit('newMsg', json); //newMsg 라는 전체 이벤트메시지 보내기
} else {
const to_userId = Object.keys(list).find((key) => list[key] == json.to);
json['is_dm'] = true;
io.to(to_userId).emit('newMsg', json); //newMsg 라는 이벤트메시지 to_userId 에게 보내기
socket.emit('newMsg', json);
}
});
//disconnect 라는 이벤트받기
socket.on('disconnect', () => {
io.emit('notice', list[socket.id] + '님이 퇴장셨습니다.');
delete list[socket.id];
});
});
http.listen(8001, () => {
console.log('Server port : ', 8001);
});
졸업프로젝트때 그렇게 하고싶었던 채팅기능을 구현할 수 있게되다니 ..
너무 기뻤다! 채팅은 정말 여기저기서 쓰일 수 있을 것같아 앞으로의 프로젝트에
도움이 많이 될 거같아서 복습 다시 해봐야겠다.