设为首页 加入收藏

TOP

html5+go+websocket简单实例代码(一)
2017-09-30 13:47:25 】 浏览:898
Tags:html5 websocket 简单 实例 代码

这次的就直接发放代码截图吧,应该是用go语言做后台一个简易的聊天,这里没用到什么特别的知识,最朴实的来实现效果,主要目的是分享下h5怎么用websocket,go搭建websocket服务的主要部分。

 

go代码部分:

  1 // WebChat project main.go
  2 package main
  3 
  4 import (
  5     "fmt"
  6     "net/http"
  7     "time"
  8 
  9     "encoding/json"
 10 
 11     "strings"
 12 
 13     "golang.org/x/net/websocket"
 14 )
 15 
 16 //全局信息
 17 var datas Datas
 18 var users map[*websocket.Conn]string
 19 
 20 func main() {
 21     fmt.Println("启动时间")
 22     fmt.Println(time.Now())
 23 
 24     //初始化
 25     datas = Datas{}
 26     users = make(map[*websocket.Conn]string)
 27 
 28     //绑定效果页面
 29     http.HandleFunc("/", h_index)
 30     //绑定socket方法
 31     http.Handle("/webSocket", websocket.Handler(h_webSocket))
 32     //开始监听
 33     http.ListenAndServe(":8", nil)
 34 }
 35 
 36 func h_index(w http.ResponseWriter, r *http.Request) {
 37 
 38     http.ServeFile(w, r, "index.html")
 39 }
 40 
 41 func h_webSocket(ws *websocket.Conn) {
 42 
 43     var userMsg UserMsg
 44     var data string
 45     for {
 46 
 47         //判断是否重复连接
 48         if _, ok := users[ws]; !ok {
 49             users[ws] = "匿名"
 50         }
 51         userMsgsLen := len(datas.UserMsgs)
 52         fmt.Println("UserMsgs", userMsgsLen, "users长度:", len(users))
 53 
 54         //有消息时,全部分发送数据
 55         if userMsgsLen > 0 {
 56             b, errMarshl := json.Marshal(datas)
 57             if errMarshl != nil {
 58                 fmt.Println("全局消息内容异常...")
 59                 break
 60             }
 61             for key, _ := range users {
 62                 errMarshl = websocket.Message.Send(key, string(b))
 63                 if errMarshl != nil {
 64                     //移除出错的链接
 65                     delete(users, key)
 66                     fmt.Println("发送出错...")
 67                     break
 68                 }
 69             }
 70             datas.UserMsgs = make([]UserMsg, 0)
 71         }
 72 
 73         fmt.Println("开始解析数据...")
 74         err := websocket.Message.Receive(ws, &data)
 75         fmt.Println("data:", data)
 76         if err != nil {
 77             //移除出错的链接
 78             delete(users, ws)
 79             fmt.Println("接收出错...")
 80             break
 81         }
 82 
 83         data = strings.Replace(data, "\n", "", 0)
 84         err = json.Unmarshal([]byte(data), &userMsg)
 85         if err != nil {
 86             fmt.Println("解析数据异常...")
 87             break
 88         }
 89         fmt.Println("请求数据类型:", userMsg.DataType)
 90 
 91         switch userMsg.DataType {
 92         case "send":
 93             //赋值对应的昵称到ws
 94             if _, ok := users[ws]; ok {
 95                 users[ws] = userMsg.UserName
 96 
 97                 //清除连接人昵称信息
 98                 datas.UserDatas = make([]UserData, 0)
 99                 //重新加载当前在线连接人
100                 for _, item := range users {
101 
102                     userData := UserData{UserName: item}
103                     datas.UserDatas = append(datas.UserDatas, userData)
104                 }
105             }
106             datas.UserMsgs = append(datas.UserMsgs, userMsg)
107         }
108     }
109 
110 }
111 
112 type UserMsg struct {
113     UserName string
114     Msg      string
115     DataType string
116 }
117 
118 type UserData struct {
119     UserName string
120 }
121 
122 type Datas struct {
123     UserMsgs  []UserMsg
124     UserDatas []UserData
125 }
View Code

 

  html代码部分:

  1 <!DOCTYPE html>
  2 <html lang="zh-CN">
  3 <head>
  4     <title></title>
  5     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  6     <!-- 新 Bootstrap 核心 CSS 文件 -->
  7     <link rel="stylesheet" href="//cdn.bootcss.com/bootst
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇golang 值得注意的地方(2则) 下一篇Go eclipse plugin

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目