WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

    WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

    在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

    现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

    HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

    WebSocket - 图1

    Cloudopt Next 中内置了对 WebSocket 的支持,你只需要声明一个注解并继承 WebSocketResource 即可。

    1. @WebSocket("/websocket")
    2. class WebSocketHandler : WebSocketResource {
    3. override suspend fun onConnectionSuccess(websocket: ServerWebSocket) {
    4. websocket.getCookie("key")
    5. websocket.getIP()
    6. websocket.writeTextMessage("Connection successful!") {
    7. println("The event of after write.")
    8. }
    9. val buffer: Buffer = Buffer.buffer().appendInt(123).appendFloat(1.23f)
    10. websocket.writeBinaryMessage(buffer) {
    11. println("The event of after write binary.")
    12. }
    13. }
    14. override suspend fun onConnectionFailure(throwable: Throwable) {
    15. }
    16. override suspend fun onConnectionComplete(websocket: ServerWebSocket) {
    17. }
    18. override suspend fun onFrameMessage(frame: WebSocketFrame, websocket: ServerWebSocket) {
    19. }
    20. override suspend fun onTextMessage(message: String, websocket: ServerWebSocket) {
    21. println(message)
    22. websocket.writeTextMessage("This is the message from the server!")
    23. }
    24. override suspend fun onBinaryMessage(buffer: Buffer, websocket: ServerWebSocket) {
    25. }
    26. override suspend fun onPong(buffer: Buffer, websocket: ServerWebSocket) {
    27. }
    28. override suspend fun onException(throwable: Throwable, websocket: ServerWebSocket) {
    29. throwable.printStackTrace()
    30. if (!websocket.isClosed) {
    31. websocket.close()
    32. }
    33. }
    34. override suspend fun onDrain(websocket: ServerWebSocket) {
    35. }
    36. override suspend fun onEnd(websocket: ServerWebSocket) {
    37. println("Connection was closed.")
    38. }
    39. }

    更多用法可以参考 https://vertx.io/docs/vertx-core/kotlin/#_websockets