Socket IO
Pre-Action
Server Side (NodeJS Express)
npm install socket.io
Client Side (React)
npm install socket.io-client
Connect
Client Side
When user enter the chatroom, the connection should be done and do it in the componentDidMount
import io from "socket.io-client";
const Chatroom = ()=>{
// const [ws,setWs] = useState(io(`Your API Site`)); Don't do this
const [ws,setWs]= useState(null);
useEffect(()=>{
setWs(io(`Your API SITE`));
},[])
}
Remember not to do it in useState !!!!
Server Side
When new user is connected, new connection will be triggered !!!
Then we can implement the logic within connection scope
const socketio = require("socket.io");
const http = require("http");
const app = express();
const server = http.createServer(app);
const io = socketio(server);
io.on("connection", (socket) => {
console.log("new connection");
...
}
)
Send and Receive Message
Send(Client)
ws.emit("sendMessage", { userId, text });
From above the example: client send an object which includes userId and text , and bookmark it as sendMessage
Receive (Server)
socket.on("sendMessage", ({ userId, text }) => {
...
}
The server can receive userId and text based on the bookmark, and can do callback function, such as send the message back to client
Sent(Server)
// send back to a client who send the message
socket.emit('getMessage', {userId,text});
// send to all clients who connect to socketio
io.sockets.emit('getMessage', {userId,text})
// send to all clients except a client who send message
socket.broadcast.emit('getMessage',{userId,text})
The server send the object to client/clients which is bookmarked as getMessage
Receive(Client)
ws.on("getMessage", ({userId,text}) => {
...
});
Client can receive userId and text based on the bookmark, and can do callback function
Room
Join Room
At the beginning, we should send the room information and user information ,such as room name, user Id
useEffect(() => {
console.log("join", name);
ws.emit("join", { room_name, userId, username });
}, []);
After the server receive the info, it will divide user into different information based room name or other information
socket.on("join", ({ room_name, userId, username }) => {
socket.join(.room_name);
});
Send Message to Room
After divided user into different groups, server can choose to send message to clients in the specific groups
socket.on("test",({test})=>{
// send to the clients in room A except the the client who send test
socket.to("room A").emit('msg', 'Welcome to Group A');
// send to all clients in room A
io.sockets.in("room A").emit("msg", {
username: "admin",
userId: 0,
text: `Welcome to Group A`,
});
}
Server send message to all client in Group A which is bookmarked as msg, so client in group B cannot receive
Quit Room
Firstly, the client request to quit room by sending message to server
ws.emit("quitRoom", { roomInfo },({msg})=>{
if(msg==="success")
console.log("quited");
});
Then, after the server receive the message , it will do leaving action
socket.on("quitRoom", ({ roomInfo }, callback) => {
socket.leave(roomInfo);
callback({msg:"success"});
});
Disconnect
Client Side
Firstly, disconnect the connection in client side
ws.close();
Server Side
After the disconnection of client side, it can be detected by server side
io.on("connection", (socket) => {
socket.on("disconnect", () => {
console.log("Disconnected");
});
})
If disconnection is triggered, Disconnected will be printed out automatically
Last updated
Was this helpful?