1. WebSocket编程

    • WebSocket是一种在单个TCP连接上进行全双工通信的协议
    • WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据
    • 在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输
    • 需要安装第三方包:
      • cmd中:go get -u -v github.com/gorilla/websocket

    1.1.2. 举个聊天室的小例子

    server.go文件代码

    1. package main
    2. import (
    3. "fmt"
    4. "net/http"
    5. "github.com/gorilla/mux"
    6. )
    7. func main() {
    8. router := mux.NewRouter()
    9. go h.run()
    10. router.HandleFunc("/ws", myws)
    11. if err := http.ListenAndServe("127.0.0.1:8080", router); err != nil {
    12. fmt.Println("err:", err)
    13. }
    14. }

    hub.go文件代码

    data.go文件代码

    1. package main
    2. type Data struct {
    3. Ip string `json:"ip"`
    4. User string `json:"user"`
    5. From string `json:"from"`
    6. Type string `json:"type"`
    7. Content string `json:"content"`
    8. UserList []string `json:"user_list"`
    9. }

    connection.go文件代码

    local.html文件代码

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <title></title>
    5. <meta http-equiv="content-type" content="text/html;charset=utf-8">
    6. <style>
    7. p {
    8. text-align: left;
    9. padding-left: 20px;
    10. }
    11. </style>
    12. </head>
    13. <body>
    14. <div style="width: 800px;height: 600px;margin: 30px auto;text-align: center">
    15. <h1>www.5lmh.comy演示聊天室</h1>
    16. <div style="width: 800px;border: 1px solid gray;height: 300px;">
    17. <div style="width: 200px;height: 300px;float: left;text-align: left;">
    18. <div id="user_list" style="overflow: auto;">
    19. </div>
    20. </div>
    21. <div id="msg_list" style="width: 598px;border: 1px solid gray; height: 300px;overflow: scroll;float: left;">
    22. </div>
    23. </div>
    24. <br>
    25. <input type="button" value="发送" onclick="send()">
    26. </div>
    27. </body>
    28. </html>
    29. <script type="text/javascript">
    30. var uname = prompt('请输入用户名', 'user' + uuid(8, 16));
    31. var ws = new WebSocket("ws://127.0.0.1:8080/ws");
    32. ws.onopen = function () {
    33. var data = "系统消息:建立连接成功";
    34. listMsg(data);
    35. };
    36. ws.onmessage = function (e) {
    37. var msg = JSON.parse(e.data);
    38. var sender, user_name, name_list, change_type;
    39. switch (msg.type) {
    40. case 'system':
    41. sender = '系统消息: ';
    42. break;
    43. case 'user':
    44. sender = msg.from + ': ';
    45. break;
    46. case 'handshake':
    47. var user_info = {'type': 'login', 'content': uname};
    48. sendMsg(user_info);
    49. return;
    50. case 'login':
    51. case 'logout':
    52. user_name = msg.content;
    53. name_list = msg.user_list;
    54. change_type = msg.type;
    55. dealUser(user_name, change_type, name_list);
    56. return;
    57. }
    58. var data = sender + msg.content;
    59. listMsg(data);
    60. };
    61. ws.onerror = function () {
    62. var data = "系统消息 : 出错了,请退出重试.";
    63. listMsg(data);
    64. };
    65. function confirm(event) {
    66. var key_num = event.keyCode;
    67. if (13 == key_num) {
    68. send();
    69. } else {
    70. return false;
    71. }
    72. }
    73. var msg_box = document.getElementById("msg_box");
    74. var content = msg_box.value;
    75. var reg = new RegExp("\r\n", "g");
    76. var msg = {'content': content.trim(), 'type': 'user'};
    77. sendMsg(msg);
    78. msg_box.value = '';
    79. }
    80. function listMsg(data) {
    81. var msg_list = document.getElementById("msg_list");
    82. var msg = document.createElement("p");
    83. msg.innerHTML = data;
    84. msg_list.appendChild(msg);
    85. msg_list.scrollTop = msg_list.scrollHeight;
    86. }
    87. function dealUser(user_name, type, name_list) {
    88. var user_list = document.getElementById("user_list");
    89. var user_num = document.getElementById("user_num");
    90. while(user_list.hasChildNodes()) {
    91. user_list.removeChild(user_list.firstChild);
    92. }
    93. for (var index in name_list) {
    94. var user = document.createElement("p");
    95. user.innerHTML = name_list[index];
    96. user_list.appendChild(user);
    97. }
    98. user_num.innerHTML = name_list.length;
    99. user_list.scrollTop = user_list.scrollHeight;
    100. var change = type == 'login' ? '上线' : '下线';
    101. var data = '系统消息: ' + user_name + ' 已' + change;
    102. listMsg(data);
    103. }
    104. function sendMsg(msg) {
    105. var data = JSON.stringify(msg);
    106. ws.send(data);
    107. }
    108. function uuid(len, radix) {
    109. var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
    110. var uuid = [], i;
    111. radix = radix || chars.length;
    112. if (len) {
    113. for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
    114. } else {
    115. var r;
    116. uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
    117. uuid[14] = '4';
    118. for (i = 0; i < 36; i++) {
    119. if (!uuid[i]) {
    120. r = 0 | Math.random() * 16;
    121. uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
    122. }
    123. }
    124. }
    125. return uuid.join('');
    126. }
    127. </script>