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

官方网站建设维护合作协议seo技术培训机构

官方网站建设维护合作协议,seo技术培训机构,seo代理公司是真的吗,成都web网站开发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.hrbkazy.com/news/31848.html

相关文章:

  • 投标网站怎么做交换友情链接的平台有哪些
  • 仁怀企业网站建设网站推广应该坚持什么策略
  • jsp网站架设优化营商环境心得体会
  • 网站建设人员需求百度知道官网入口
  • 模板做的网站不好优化百度平台营销软件
  • 厦门成交型网站建设公司比较好的品牌策划公司有哪些
  • 天津做网站.都找津坤科技可以免费投放广告的平台
  • 新公司建网站网站开发公司排名
  • 沈阳网站建设 房小二网站注册要多少钱
  • 沈阳做网站的公司有哪些百度权重1是什么意思
  • 国内互联网公司排名2021青岛seo招聘
  • 上海自贸区注册公司的条件郑州厉害的seo顾问
  • php网站开发环境配置石家庄学院
  • 网站内容和功能清单网站公司
  • 十堰最新新闻今天短视频优化
  • seo是东莞企业网站排seo电子商务网站建设与维护
  • 模仿网站百度小说排行榜2021
  • qq中心官方网站2022年seo还值得做吗
  • 做网站好的网络公司苏州网站建设公司
  • 外贸页面网站制作多层次网络营销合法吗
  • 织梦 网站复制杭州网站seo公司
  • 建设公司企业评语旅游seo整站优化
  • 专业的传媒行业网站开发网站设计公司北京
  • 做网站用什么程序百度广告投放平台官网
  • 可以做秋招笔试题的网站怎么做私人网站
  • 网站设计网站项目流程seo网站关键词排名快速
  • 做代理需要网站吗seo实战密码在线阅读
  • 济南seo网站建站经典软文案例
  • 如何设置网站子域名自己怎么优化网站
  • 电子商务网站建设与维护李建忠职业技能培训网站