分享
  1. 首页
  2. 文章

[Golang]简单的聊天室实现

abv123456789 · · 5190 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。


最近写了一个chrome的websocket extension, server端用的是Java的Netty框架, 后来发现golang 实现websocket 非常简单,高效, 下面是例子, 简单实现了用户登录,广播,相当于聊天室!


  1. package main
  2. import (
  3. "code.google.com/p/go.net/websocket"
  4. "html/template"
  5. "log"
  6. "net/http"
  7. "os"
  8. "strings"
  9. "time"
  10. )
  11. const (
  12. listenAddr = "localhost:9527" // server address
  13. )
  14. var (
  15. pwd, _ = os.Getwd()
  16. RootTemp = template.Must(template.ParseFiles(pwd + "/chat.html"))
  17. JSON = websocket.JSON // codec for JSON
  18. Message = websocket.Message // codec for string, []byte
  19. ActiveClients = make(map[ClientConn]string) // map containing clients
  20. User = make(map[string]string)
  21. )
  22. // Initialize handlers and websocket handlers
  23. func init() {
  24. User["aaa"] = "aaa"
  25. User["bbb"] = "bbb"
  26. User["test"] = "test"
  27. User["test2"] = "test2"
  28. User["test3"] = "test3"
  29. }
  30. // Client connection consists of the websocket and the client ip
  31. type ClientConn struct {
  32. websocket *websocket.Conn
  33. clientIP string
  34. }
  35. // WebSocket server to handle chat between clients
  36. func SockServer(ws *websocket.Conn) {
  37. var err error
  38. var clientMessage string
  39. // use []byte if websocket binary type is blob or arraybuffer
  40. // var clientMessage []byte
  41. // cleanup on server side
  42. defer func() {
  43. if err = ws.Close(); err != nil {
  44. log.Println("Websocket could not be closed", err.Error())
  45. }
  46. }()
  47. client := ws.Request().RemoteAddr
  48. log.Println("Client connected:", client)
  49. sockCli := ClientConn{ws, client}
  50. ActiveClients[sockCli] = ""
  51. log.Println("Number of clients connected:", len(ActiveClients))
  52. // for loop so the websocket stays open otherwise
  53. // it'll close after one Receieve and Send
  54. for {
  55. if err = Message.Receive(ws, &clientMessage); err != nil {
  56. // If we cannot Read then the connection is closed
  57. log.Println("Websocket Disconnected waiting", err.Error())
  58. // remove the ws client conn from our active clients
  59. delete(ActiveClients, sockCli)
  60. log.Println("Number of clients still connected:", len(ActiveClients))
  61. return
  62. }
  63. var msg_arr = strings.Split(clientMessage, "|")
  64. if msg_arr[0] == "login" && len(msg_arr) == 3 {
  65. name := msg_arr[1]
  66. pass := msg_arr[2]
  67. if pass == User[name] {
  68. ActiveClients[sockCli] = name
  69. if err = Message.Send(ws, "login|"+name); err != nil {
  70. log.Println("Could not send message to ", client, err.Error())
  71. }
  72. } else {
  73. log.Println("login faild:", clientMessage)
  74. }
  75. } else if msg_arr[0] == "msg" {
  76. if ActiveClients[sockCli] != "" {
  77. clientMessage = "msg|" + time.Now().Format("2006年01月02日 15:04:05") + " " + ActiveClients[sockCli] + " Said: " + msg_arr[1]
  78. for cs, na := range ActiveClients {
  79. if na != "" {
  80. if err = Message.Send(cs.websocket, clientMessage); err != nil {
  81. log.Println("Could not send message to ", cs.clientIP, err.Error())
  82. }
  83. }
  84. }
  85. }
  86. }
  87. }
  88. }
  89. // RootHandler renders the template for the root page
  90. func RootHandler(w http.ResponseWriter, req *http.Request) {
  91. err := RootTemp.Execute(w, listenAddr)
  92. if err != nil {
  93. http.Error(w, err.Error(), http.StatusInternalServerError)
  94. }
  95. }
  96. func main() {
  97. http.HandleFunc("/", RootHandler)
  98. http.Handle("/socket", websocket.Handler(SockServer))
  99. err := http.ListenAndServe(listenAddr, nil)
  100. if err != nil {
  101. panic("ListenAndServe: " + err.Error())
  102. }
  103. }

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:abv123456789

查看原文:[Golang]简单的聊天室实现

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
5190 次点击
被以下专栏收入,发现更多相似内容
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏