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
package cn.flightfeather.supervision.websocket
 
import org.java_websocket.WebSocket
import org.java_websocket.drafts.Draft
import org.java_websocket.exceptions.InvalidDataException
import org.java_websocket.framing.CloseFrame
import org.java_websocket.handshake.ClientHandshake
import org.java_websocket.handshake.ServerHandshakeBuilder
import org.java_websocket.server.WebSocketServer
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
import java.net.InetSocketAddress
 
/**
 * 虚拟聊天室服务端
 * @author riku
 * Date: 2019/11/11
 */
@Component
class VMRoomWebSocketServer(port: Int = 9008) : WebSocketServer(InetSocketAddress(port)) {
 
    @Autowired
    lateinit var processor: Processor
 
    override fun onWebsocketHandshakeReceivedAsServer(conn: WebSocket?, draft: Draft?, request: ClientHandshake?): ServerHandshakeBuilder {
        //请求判断,若header没有cookie项,则直接拒绝连接
        if (request?.hasFieldValue("Cookie") == false) {
            throw InvalidDataException(CloseFrame.POLICY_VALIDATION, "Not accepted!")
        }
        return super.onWebsocketHandshakeReceivedAsServer(conn, draft, request)
    }
 
    override fun onOpen(p0: WebSocket?, p1: ClientHandshake?) {
        processor.register(this, p0, p1)
        processor.startTimingServerMsg(this, p0)
    }
 
    override fun onMessage(p0: WebSocket?, p1: String?) {
        //根据通道绑定的会议室,将其发送的信息广播给在该会议室的所有人
        val msg = processor.parseToWebSocketMsg(p1, MeetingMsgVo::class.java)
        processor.reply(p0, msg)
        processor.broadcast(this, p0, msg, MsgType.MsgReceive)
        processor.save(p0, msg.msgVoList)
 
//        processor.callNameJudgement(this, p0, msg)
    }
 
    override fun onStart() {
 
    }
 
    override fun onError(p0: WebSocket?, p1: Exception?) {
 
    }
 
    override fun onClose(p0: WebSocket?, p1: Int, p2: String?, p3: Boolean) {
        //todo 广播退出会议室的用户等信息
        processor.exit(p0)
        processor.stopTimingServerMsg(this, p0)
    }
 
}