-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
180 lines (142 loc) · 5.33 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
const Koa = require('koa');
const server = new Koa();
const Router = require('koa-router');
const router = new Router();
const IO = require('koa-socket');//实现对websocket的对接的
const io = new IO();
const render = require('koa-ejs');//模板
const path = require('path');//为了写模板的路径引入的
const body = require('koa-better-body');
const session = require('koa-session');//挂session,貌似这个例子不需要session其实
const static = require('koa-static')
const IncomingForm = require('formidable');//用来保存后缀的
const form = new IncomingForm();
form.keepExtensions = true
form.encoding = 'utf-8'
form.uploadDir = path.join(__dirname, 'static/upload')
//上传文件的制定路径
server.use(body({
uploadDir: './static/upload',
IncomingForm: form
}))
//用户需要一个,那么小组是不是也需要呢
let { store } = require('./js/store.js');
server.keys = ['AddJunZ'];
const CONFIG = {
key: 'AddJunZ',
maxAge: 1800000
}
//使用session,配置项为CONFIG
server.use(session(CONFIG, server));
//这样一挂后,路由里都能使用了?
render(server, {
root: path.join(__dirname, 'views'),
layout: false,
viewExt: 'ejs',
cache: false,
debug: false
})
router.use('', require('./routes/index.js'))
server.use(router.routes())
server.use(router.allowedMethods())
server.use(static('./static'))
//socket
io.attach(server);
//附着之后可以使用server.io来访问socket
//如果没有的话,则浏览器向服务器方向的连接就不成立
io.use(async (ctx, next) => {
let start = new Date()
await next()
console.log(`response time: ${new Date() - start}ms`)
})
//-------------------------------------------------------
//-------------------------------------------------------
//在这里监听html触发的事件
//登录后就跳到聊天界面
server.io.on('connection', ctx => {
console.log('连接到客户端')
})
server.io.on('login', (ctx, data) => {
// server.io.broadcast('aaa', `1111111`);
console.log('login', data);
// console.log('目前的session',ctx.session) 不是登陆的是没有的//???
let username = data.username;
let socketId = ctx.socket.socket.id;
console.log(socketId);//每次登录都有一个特定的socketid
store.set(username, socketId);
//通知所有登录者
console.log(store.state);
io.broadcast("online", store.state);
//用户退出登录应该是socket断开连接
//不能用server.io.on?它会断开所有的server连接??一个用户退出全部退出??ctx.socket针对某一用户的访问?
// server.io.on('disconnect',()=>{
ctx.socket.on('disconnect', () => {
//通过socketId寻找对应的用户名findUserBySocketId
store.delete(findUserBySocketId(socketId));
io.broadcast("online", store.state)
})
})
//
server.io.on('toPersonMsg', (ctx, data) => {
console.log(data);
// { value: '/#sydq_8zlgu2fIMKIAAAB', msg: '12313' }
//app._io.to(toId).emit("allMsg", `${username} say to you: ${content}`);
let { socketId, msg } = data;
let ownSocketId = ctx.socket.socket.id;
let ownName = findUserBySocketId(ownSocketId);
let name = findUserBySocketId(socketId);
ctx.socket.emit('personMsg', `你对${name}说 : ${msg}`);
//这里需要切换到被发消息的那个人的socketId,然后执行emit命令,先不跳试试
server._io.to(socketId).emit("personMsg", `${ownName}对你说 : ${msg}`);
})
server.io.on('groupChat',(ctx,data)=>{
let {groupName} = data;
ctx.socket.socket.join(groupName);
console.log(`加入组别${groupName}`);
})
server.io.on('toGroupMsg',async (ctx,data)=>{
let {groupName,msg} = data;
let ownName = findUserBySocketId(ctx.socket.socket.id);
server._io.to(groupName).emit('allMsg',`${ownName}对${groupName}所有人说 : ${msg}`);
})
//给所有人的回话
server.io.on('toAllMsg', (ctx, data) => {
let ownSocketId = ctx.socket.socket.id;
let ownName = findUserBySocketId(ownSocketId);
let msg = data.msg;
server.io.broadcast('allMsg', `${ownName}对所有人说 : ${msg}`);
})
server.io.on('toPersonFile', (ctx, data) => {
console.log('触发文件上传到用户的服务');
let { socketId, fileName } = data;
console.log(`'服务器拿到文件对象了,要传给${socketId},要处理的文件名是${fileName}`);
let dlFilePath = `http://localhost:8080/downloadFile/${fileName}`;
let ownSocketId = ctx.socket.socket.id;
let ownName = findUserBySocketId(ownSocketId);
let name = findUserBySocketId(socketId);
server._io.to(socketId).emit('personFile', {
dlFilePath: dlFilePath,
fileName: fileName,
ownName: ownName
})//下载的路径
ctx.socket.emit('personMsg', `你对${name}发送了文件: ${fileName}`)
})
//通过socketId寻找对应的用户名findUserBySocketId
var findUserBySocketId = socketId => {
for (key in store.state) {
if (store.state[key] == socketId) {
return key;
}
}
}
server.io.on('exit', (ctx, data) => {
let username = data.username;
store.delete(username);
console.log(store.state)
io.broadcast("online", store.state);
})
//-------------------------------------------------------
//-------------------------------------------------------
server.listen(8080, () => {
console.log('监听8080-----------');
})