当前位置: 首页 > news >正文

官方网站建设维护合作协议百度快速查询

官方网站建设维护合作协议,百度快速查询,什么网站有做册子版,怎么做外网网站监控1. WebSocket编程 文章目录1. WebSocket编程1.1.1. webSocket是什么1.1.2. 举个聊天室的小例子server.go文件代码hub.go文件代码data.go文件代码local.html文件代码1.1.1. webSocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之…

1. WebSocket编程

文章目录

  • 1. WebSocket编程
      • 1.1.1. webSocket是什么
      • 1.1.2. 举个聊天室的小例子
        • server.go文件代码
        • hub.go文件代码
        • data.go文件代码
        • local.html文件代码

1.1.1. webSocket是什么

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

1.1.2. 举个聊天室的小例子

注意:
这里需要在terminal同时运行四个go文件
在这里插入图片描述

在同一级目录下新建四个go文件connection.go|data.go|hub.go|server.go

运行

go run server.go hub.go data.go connection.go

运行之后执行local.html文件

server.go文件代码

package mainimport ("fmt""net/http""github.com/gorilla/mux"
)func main() {router := mux.NewRouter()go h.run()router.HandleFunc("/ws", myws)if err := http.ListenAndServe("127.0.0.1:8080", router); err != nil {fmt.Println("err:", err)}
}

hub.go文件代码

package mainimport "encoding/json"var h = hub{c: make(map[*connection]bool),u: make(chan *connection),b: make(chan []byte),r: make(chan *connection),
}type hub struct {c map[*connection]boolb chan []byter chan *connectionu chan *connection
}func (h *hub) run() {for {select {case c := <-h.r:h.c[c] = truec.data.Ip = c.ws.RemoteAddr().String()c.data.Type = "handshake"c.data.UserList = user_listdata_b, _ := json.Marshal(c.data)c.sc <- data_bcase c := <-h.u:if _, ok := h.c[c]; ok {delete(h.c, c)close(c.sc)}case data := <-h.b:for c := range h.c {select {case c.sc <- data:default:delete(h.c, c)close(c.sc)}}}}
}

data.go文件代码

package maintype Data struct {Ip       string   `json:"ip"`User     string   `json:"user"`From     string   `json:"from"`Type     string   `json:"type"`Content  string   `json:"content"`UserList []string `json:"user_list"`
}
connection.go文件代码
package mainimport ("encoding/json""fmt""net/http""github.com/gorilla/websocket"
)type connection struct {ws   *websocket.Connsc   chan []bytedata *Data
}var wu = &websocket.Upgrader{ReadBufferSize: 512,WriteBufferSize: 512, CheckOrigin: func(r *http.Request) bool { return true }}func myws(w http.ResponseWriter, r *http.Request) {ws, err := wu.Upgrade(w, r, nil)if err != nil {return}c := &connection{sc: make(chan []byte, 256), ws: ws, data: &Data{}}h.r <- cgo c.writer()c.reader()defer func() {c.data.Type = "logout"user_list = del(user_list, c.data.User)c.data.UserList = user_listc.data.Content = c.data.Userdata_b, _ := json.Marshal(c.data)h.b <- data_bh.r <- c}()
}func (c *connection) writer() {for message := range c.sc {c.ws.WriteMessage(websocket.TextMessage, message)}c.ws.Close()
}var user_list = []string{}func (c *connection) reader() {for {_, message, err := c.ws.ReadMessage()if err != nil {h.r <- cbreak}json.Unmarshal(message, &c.data)switch c.data.Type {case "login":c.data.User = c.data.Contentc.data.From = c.data.Useruser_list = append(user_list, c.data.User)c.data.UserList = user_listdata_b, _ := json.Marshal(c.data)h.b <- data_bcase "user":c.data.Type = "user"data_b, _ := json.Marshal(c.data)h.b <- data_bcase "logout":c.data.Type = "logout"user_list = del(user_list, c.data.User)data_b, _ := json.Marshal(c.data)h.b <- data_bh.r <- cdefault:fmt.Print("========default================")}}
}func del(slice []string, user string) []string {count := len(slice)if count == 0 {return slice}if count == 1 && slice[0] == user {return []string{}}var n_slice = []string{}for i := range slice {if slice[i] == user && i == count {return slice[:count]} else if slice[i] == user {n_slice = append(slice[:i], slice[i+1:]...)break}}fmt.Println(n_slice)return n_slice
}

local.html文件代码

<!DOCTYPE html>
<html>
<head><title></title><meta http-equiv="content-type" content="text/html;charset=utf-8"><style>p {text-align: left;padding-left: 20px;}</style>
</head>
<body>
<div style="width: 800px;height: 600px;margin: 30px auto;text-align: center"><h1>www.5lmh.comy演示聊天室</h1><div style="width: 800px;border: 1px solid gray;height: 300px;"><div style="width: 200px;height: 300px;float: left;text-align: left;"><p><span>当前在线:</span><span id="user_num">0</span></p><div id="user_list" style="overflow: auto;"></div></div><div id="msg_list" style="width: 598px;border:  1px solid gray; height: 300px;overflow: scroll;float: left;"></div></div><br><textarea id="msg_box" rows="6" cols="50" onkeydown="confirm(event)"></textarea><br><input type="button" value="发送" onclick="send()">
</div>
</body>
</html>
<script type="text/javascript">var uname = prompt('请输入用户名', 'user' + uuid(8, 16));var ws = new WebSocket("ws://127.0.0.1:8080/ws");ws.onopen = function () {var data = "系统消息:建立连接成功";listMsg(data);};ws.onmessage = function (e) {var msg = JSON.parse(e.data);var sender, user_name, name_list, change_type;switch (msg.type) {case 'system':sender = '系统消息: ';break;case 'user':sender = msg.from + ': ';break;case 'handshake':var user_info = {'type': 'login', 'content': uname};sendMsg(user_info);return;case 'login':case 'logout':user_name = msg.content;name_list = msg.user_list;change_type = msg.type;dealUser(user_name, change_type, name_list);return;}var data = sender + msg.content;listMsg(data);};ws.onerror = function () {var data = "系统消息 : 出错了,请退出重试.";listMsg(data);};function confirm(event) {var key_num = event.keyCode;if (13 == key_num) {send();} else {return false;}}function send() {var msg_box = document.getElementById("msg_box");var content = msg_box.value;var reg = new RegExp("\r\n", "g");content = content.replace(reg, "");var msg = {'content': content.trim(), 'type': 'user'};sendMsg(msg);msg_box.value = '';}function listMsg(data) {var msg_list = document.getElementById("msg_list");var msg = document.createElement("p");msg.innerHTML = data;msg_list.appendChild(msg);msg_list.scrollTop = msg_list.scrollHeight;}function dealUser(user_name, type, name_list) {var user_list = document.getElementById("user_list");var user_num = document.getElementById("user_num");while(user_list.hasChildNodes()) {user_list.removeChild(user_list.firstChild);}for (var index in name_list) {var user = document.createElement("p");user.innerHTML = name_list[index];user_list.appendChild(user);}user_num.innerHTML = name_list.length;user_list.scrollTop = user_list.scrollHeight;var change = type == 'login' ? '上线' : '下线';var data = '系统消息: ' + user_name + ' 已' + change;listMsg(data);}function sendMsg(msg) {var data = JSON.stringify(msg);ws.send(data);}function uuid(len, radix) {var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');var uuid = [], i;radix = radix || chars.length;if (len) {for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];} else {var r;uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';uuid[14] = '4';for (i = 0; i < 36; i++) {if (!uuid[i]) {r = 0 | Math.random() * 16;uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];}}}return uuid.join('');}
</script>![在这里插入图片描述](https://img-blog.csdnimg.cn/64552642dadb45a18bcfc34020cfff40.png)
多开几个网页就可以呀聊天
http://www.shuangfujiaoyu.com/news/9570.html

相关文章:

  • 网站开发项目描述搜索引擎营销的名词解释
  • 学程序员需要什么基础seo百度快照优化公司
  • 绍兴以往网站招工做长沙疫情最新消息今天封城了
  • docker pull wordpress佛山优化推广
  • 电商类网站模板网络培训中心
  • 可信网站查询免费的网络推广渠道有哪些
  • wordpress lnmp1.4seo综合查询
  • 网站 昆明网上兼职外宣推广怎么做
  • wordpress 4评测网站搜索引擎优化工具
  • 低价服装网站建设qq群推广引流免费网站
  • html5大气网站唯尚广告联盟app下载
  • 99到家网站怎么做seo是什么意思电商
  • 郑州网站建设包括哪些新泰网站seo
  • 网站留言如何做的关键词搜索排名工具
  • 网站建设培训要多久谷歌seo博客
  • 惠州做网站开发百度权重5的网站能卖多少钱
  • 装饰工程有限公司资质怎么办理免费的seo优化
  • 故城建设局政府网站高端企业网站模板
  • 企业内部管理系统网站建设国内最新消息新闻
  • 个人网站 icp 代理seo是免费的吗
  • wordpress页面展示多个文章青岛网络优化厂家
  • 织梦网站手机版怎么做搜索引擎优化分析
  • 做直播网站需要哪些技术百度近日收录查询
  • 专注昆明网站建设手机360优化大师官网
  • 网站主机的选择与优化网络营销的含义
  • 网站开发无锡武汉关键词排名推广
  • 网站制作前期所需要准备seo的最终是为了达到
  • 化妆品网站优化企业网站的作用有哪些
  • 七台河网站制作新闻头条最新消息30字
  • 重钢建设公司官方网站关键词提取工具