加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang实现基于Websocket协议的H5聊天室(上)

发布时间:2020-12-16 18:25:34 所属栏目:大数据 来源:网络整理
导读:http://www.cnblogs.com/wangrudong003/p/5535689.html go代码部分: [cpp] view plain copy //WebChatprojectmain.go packagemain import( "fmt" "net/http" "time" "encoding/json" "strings" "golang.org/x/net/websocket" ) //全局信息 vardatasDatas va
                                                                                                     

http://www.cnblogs.com/wangrudong003/p/5535689.html

go代码部分:

[cpp]view plaincopy

  1. //WebChatprojectmain.go

  2. packagemain

  3. import(

  4. "fmt"

  5. "net/http"

  6. "time"

  7. "encoding/json"

  8. "strings"

  9. "golang.org/x/net/websocket"

  10. )

  11. //全局信息

  12. vardatasDatas

  13. varusersmap[*websocket.Conn]string

  14. funcmain(){

  15. fmt.Println("启动时间")

  16. fmt.Println(time.Now())

  17. //初始化

  18. datas=Datas{}

  19. users=make(map[*websocket.Conn]string)

  20. //绑定效果页面

  21. http.HandleFunc("/",h_index)

  22. //绑定socket方法

  23. http.Handle("/webSocket",websocket.Handler(h_webSocket))

  24. //开始监听

  25. http.ListenAndServe(":8080",nil)

  26. }

  27. funch_index(whttp.ResponseWriter,r*http.Request){

  28. http.ServeFile(w,r,"index.html")

  29. }

  30. funch_webSocket(ws*websocket.Conn){

  31. varuserMsgUserMsg

  32. vardatastring

  33. for{

  34. //判断是否重复连接

  35. if_,ok:=users[ws];!ok{

  36. users[ws]="匿名"

  37. }

  38. userMsgsLen:=len(datas.UserMsgs)

  39. fmt.Println("UserMsgs",userMsgsLen,"users长度:",len(users))

  40. //有消息时,全部分发送数据

  41. ifuserMsgsLen>0{

  42. b,errMarshl:=json.Marshal(datas)

  43. iferrMarshl!=nil{

  44. fmt.Println("全局消息内容异常...")

  45. break

  46. }

  47. forkey,_:=rangeusers{

  48. errMarshl=websocket.Message.Send(key,string(b))

  49. iferrMarshl!=nil{

  50. //移除出错的链接

  51. delete(users,key)

  52. fmt.Println("发送出错...")

  53. break

  54. }

  55. }

  56. datas.UserMsgs=make([]UserMsg,0)

  57. }

  58. fmt.Println("开始解析数据...")

  59. err:=websocket.Message.Receive(ws,&data)

  60. fmt.Println("data:",data)

  61. iferr!=nil{

  62. fmt.Println("接收出错...")

  63. break

  64. }

  65. data=strings.Replace(data,"/n","",0)

  66. err=json.Unmarshal([]byte(data),&userMsg)

  67. iferr!=nil{

  68. fmt.Println("解析数据异常...")

  69. break

  70. }

  71. fmt.Println("请求数据类型:",userMsg.DataType)

  72. switchuserMsg.DataType{

  73. case"send":

  74. //赋值对应的昵称到ws

  75. users[ws]=userMsg.UserName

  76. //清除连接人昵称信息

  77. datas.UserDatas=make([]UserData,0)

  78. //重新加载当前在线连接人

  79. for_,item:=rangeusers{

  80. userData:=UserData{UserName:item}

  81. datas.UserDatas=append(datas.UserDatas,userData)

  82. }

  83. }

  84. datas.UserMsgs=append(datas.UserMsgs,userMsg)

  85. }

  86. }

  87. }

  88. typeUserMsgstruct{

  89. UserNamestring

  90. Msgstring

  91. DataTypestring

  92. }

  93. typeUserDatastruct{

  94. UserNamestring

  95. }

  96. typeDatasstruct{

  97. UserMsgs[]UserMsg

  98. UserDatas[]UserData

  99. }




查看原文:http://www.zoues.com/2016/10/20/golang%e5%ae%9e%e7%8e%b0%e5%9f%ba%e4%ba%8ewebsocket%e5%8d%8f%e8%ae%ae%e7%9a%84h5%e8%81%8a%e5%a4%a9%e5%ae%a4%e4%b8%8a/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读