Overview
WebSocket is a computer communications protocol, providing full-duplex communication channels over a single TCP connection. Thus, WebSocket will help you to send a data to server and receive event-driven responses without having to poll the server for a reply.
Setup Server.
If you already have WebSocket server or know any urls, just pass this section. This sections is going to talk about how to setup Websocket server. Server is consist of Node.js and Typescript. Click link to see more details.
Setup Node.js and Typescript
npm init -y
npm install @types/node --save-dev
npm install typescript --save-dev
npm install ts-node --save-dev
npm i ws
npm i @types/ws --save-dev
ws
is Node.js WebSocket library. It helps you to develop WebSocket server in Node.js.
Code
import { WebSocketServer } from 'ws';
const Port = 5174
const ws = new WebSocketServer({
port: Port,
});
ws.on('connection', (ws) => {
ws.on('error', console.error)
ws.on('message', (data) => {
console.log(`Received: ${data}`);
ws.send('Send back');
});
ws.send('Hello World');
});
console.log(`New WebSocket sever starts at ws://localhost:${Port}`);
Make a file named websocket.ts
. Copy and Past Code into file that you just created.
If you type command ts-node websocket.ts
, you will see ws://localhost:5174
log in your command line.
WebSocket server will starts with ws
or wss
according to your secure setting. They are very similar with http
and https
First way: ws
package.
Implement WeSocket client a same package that we used in Server. ws
provides client utilities.
Click link to see more details.
Installation
npm i ws
npm i @types/ws --save-dev
Install the package into your client (Vue 3 project) before you start.
Code
<script setup lang="ts">
import { onBeforeUnmount, ref } from 'vue'
const webSocket = ref(new WebSocket('ws://localhost:5174'))
const messageFromSever = ref('')
const isConnected = ref(false)
webSocket.value.onopen = (e) => {
console.log('onopen', e)
isConnected.value = true
webSocket.value.send('Hello I am testing')
}
webSocket.value.onmessage = (e) => {
console.log('onmessage', e)
messageFromSever.value = e.data
}
webSocket.value.onclose = (e) => {
console.log('onclose', e)
}
webSocket.value.onerror = (e) => {
console.log('onerror', e)
}
onBeforeUnmount(() => {
webSocket.value.close()
})
</script>
<template>
<div>
<div>
Connection: {{ isConnected ? 'Connected' : 'Disconnected' }}
</div>
<div>
From sever: {{ messageFromSever }}
</div>
</div>
</template>
Create any name vue file then copy and past the code.
The isConnected
variable is used for checking connecting between WebSocket server and client success.
The messageFromSever
variable will contain a message from server.
Depending on data from server, it could not be string type. (It will be string if you followed the server section)
Open and error
onopen
event will fire when client successfully connect with WebSocket server.
onerror
message will be fire when connection meets any errors on connection.
Send data
send
function will send a message to WebSocket server.
send
allows string or a binary format such as Blob
, ArrayBuffer
.
The message from server is contained in e.data. If it could be any type according to data.
Rate Limiting
In order to prevent to make your network connection slow, you can check buffer amount.
const interval = setInterval(() => {
if (socket.bufferedAmount == 0) {
socket.send('some data...');
clearInterval(interval);
}
}, 100);
every 100ms examine the socket and send more data only if all the existing data was sent out
Receive message
onmessage
is event that receive message from Server.
close handling
onclose
event will fire when client close connection with server. Close event includes code (number), reason(string) and wasClean.
wasClean is boolean type of data used for checking it's cleaned up.
Second Way: useWebSocket
in vueuse
module.
vueuse module will be used in second way. The vueuse is collection of Vue composition utilities.
Although Vueuse
module has a plenty of utilities, we will use useWebSocket
in order to handle WebSocket connection.
Installation
npm i @vueuse/core
Install module before you use it. It contains types, so you don't need to install types. If you would like to read documentation first, here is the link.
Code
<script setup lang="ts">
import { onMounted } from 'vue'
import { useWebSocket } from '@vueuse/core'
const { data, status, send } = useWebSocket('ws://localhost:5174')
onMounted(() => {
send('Hello I am testing')
})
</script>
<template>
<div>
<div>
Status: {{ status }}
</div>
<div>
From sever: {{ data }}
</div>
</div>
</template>
Status has three values including OPEN
, CONNECTING
, CLOSED
If you pass autoReconnect
option, it tries to reconnect on erros automatcally
const { data, status, send } = useWebSocket('ws://localhost:5174', {
autoReconnect: true,
})
const { status, data, close } = useWebSocket('ws://websocketurl', {
autoReconnect: {
retries: 3,
delay: 1000,
onFailed() {
alert('Failed to connect WebSocket after 3 retries')
},
},
})
You can prevent time of calling and delay with options.
Open
Once you enter the page, useWebSocket
will try to connect with WebSocket in link automatically.
Send
send
is the function that sends a message to WebSocket server.
Receive message
Whenever you receive message from server, data will be changed to message that came from server.
Close
You have to close connection in onBeforeUnmount
By contrast, you are not required to call close()
function before you leave the page.
The reason is that useWebSocket
calls close()
if you don't call any close()
.