---
title: Socket Services 如何使用
tags: Templates, Talk
description: View the slide with "Slide Mode".
---
# Socket Services 如何使用!
>製作Tinn
>參考:Google各位大大
>[範例參考詳解](https://socket.io/)
---
## 目的
透過 Websocket Services 進行廣播、前後端即時傳遞訊息
---
## Usage flow
```graphviz
digraph graph_name{
rankdir=LR
bgcolor="transparent"
Backend[shape=box,fontsize=22] WebsocketService[shape=circle, fontcolor=red,fontsize=24]
"Backend"->WebsocketService[label=API]
WebsocketService->{Frontend_All, Frontend_Dept,Frontend_Group,Frontend_UserA,Frontend_UserB}
Frontend_All[fontsize=20]
Frontend_Dept[fontsize=20]
Frontend_Group[fontsize=20]
Frontend_UserA[fontsize=20]
Frontend_UserB[fontsize=20]
}
```
---
## 初始化
- 使用 socket.io
- 定義監聽事件
---
```javascript=
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
let socket = io('http://localhost:7777');
socket.on('connect', function() {
//監聽全部
socket.on('bck_ybweb', function(data) {
console.log(data, '全體廣播')
})
//監聽個人 `${companyCode_systemCode_account}`
socket.on('bck_ybweb_20181201', function(data) {
console.log(data, '個人廣播')
})
//監聽部門 `${companyCode_systemCode_deptId}`
socket.on('bck_ybweb_18', function(data) {
console.log(data, '部門廣播')
})
//監聽群組 `${companyCode_systemCode_groupId}`
socket.on('bck_ybweb_18_6', function(data) {
console.log(data, '部門群組廣播')
})
//監聽踢出事件
socket.on('kickout', function(data) {
// alert('您被登出')
//call logout api
window.location.href = "about:blank";
window.close();
})
//連線時向WebsocketService告知(可有可無)
socket.emit('join', {
userName: '松庭',
companyCode: 'bck',
systemCode: 'ybweb',
deptId: 18,
groupId: 6,
account: 20181201,
socketId: socket.id,
connected_on: new Date()
});
})
```
### Vue.js
```shell=
npm install socket.io-client
```
```typescript=
import io from 'socket.io-client'
```
```typescript=
this.companyCode = 'bck' //公司代號
this.systemCode = 'ybweb' //專案代號
this.deptId = 18 //部門id
this.groupId = 6 //組別id
this.account = 20181201 //員編
this.host = 'http://example.socket/65535'
io(this.host).on('connect', () => {
//監聽全部
io.on('bck_ybweb', (data) {
console.log(data, '全體廣播')
})
//監聽個人 `${companyCode_systemCode_account}`
io.on('bck_ybweb_20181201', (data) {
console.log(data, '個人廣播')
})
//監聽部門 `${companyCode_systemCode_deptId}`
io.on('bck_ybweb_18', (data) {
console.log(data, '部門廣播')
})
//監聽群組 `${companyCode_systemCode_groupId}`
io.on('bck_ybweb_18_6', (data) {
console.log(data, '部門群組廣播')
})
//監聽踢出事件
io.on('kickout', (data) {
// alert('您被登出')
//call logout api
window.location.href = "about:blank";
window.close();
})
//連線時向WebsocketService告知(可有可無)
io.emit('join', {
userName: '松庭',
companyCode: 'bck',
systemCode: 'ybweb',
deptId: 18,
groupId: 6,
account: 20181201,
socketId: socket.id,
connected_on: new Date()
});
})
```
---
## API requests
```
Content-Type : application/json
```
```
POST /api/notify/:apiKey' //請先索取專案對應的apiKey
```
### input parameters
```json=
{
"companyCode": "bck",
"systemCode": "ybweb",
"deptId": 18,
"groupId": 6,
"account": "20181201"
"action": "message",
"data": "hello"
}
```
### 欄位說明
- ```companyCode``` (Require|String): 公司別代碼
- ```systemCode``` (Require|String): 專案代碼
- ```deptId``` (Nullable): 部門id
- ```groupId``` (Nullable): 群組id
- ```account``` (Nullable): 員工編號
- ```action``` (Require|in: message, permission): 動作
- ```data``` : 傳送訊息的內容
```
action 只能填寫 message 或 permission
```
```
groupId 有填寫時 depId 不得為空
```
### Output:
#### success response :
```
Http statusCode : 200
```
```json=
{
"message": "ok"
}
```
#### error response :
```
Http statusCode : 400
```
```json=
{
"errorMessage": "後端給的錯誤訊息"
}
```
### Demo
---
<img src="https://i.imgur.com/IJMDIH2.gif">
---
### 進階- 確認前端是否收到消息
[DEMO 效果 請看這裡 ](https://i.imgur.com/t90bPkR.gif)
[socket.emit vs io.emit 說明](https://stackoverflow.com/questions/32674391/io-emit-vs-socket-emit/32675498)
```javascript=
// Backend
// 注意這裡使用的 'emit' 必須為 'socket' 不是外層的 'io'
// 否則會提示錯誤訊息 Callbacks are not supported when broadcasting at Socket.emit
io.on('connection', (socket) => {
socket.emit('events', 'hungry', (callback) => {
//callback 數據將被 'yes'
if(callback){
dosomething......
}
});
});
//Frontend
socket.on('connect', () => {
socket.on('events', (msg, fn) => {
fn('yes')
console.log(msg) // hungry
});
});
```