[Golang]简单的聊天室实现
来源:互联网 发布:张无忌最爱赵敏 知乎 编辑:程序博客网 时间:2024/04/30 17:34
最近写了一个chrome的websocket extension, server端用的是Java的Netty框架, 后来发现golang 实现websocket 非常简单,高效, 下面是例子, 简单实现了用户登录,广播,相当于聊天室!- package main
- import (
- "code.google.com/p/go.net/websocket"
- "html/template"
- "log"
- "net/http"
- "os"
- "strings"
- "time"
- )
- const (
- listenAddr = "localhost:9527" // server address
- )
- var (
- pwd, _ = os.Getwd()
- RootTemp = template.Must(template.ParseFiles(pwd + "/chat.html"))
- JSON = websocket.JSON // codec for JSON
- Message = websocket.Message // codec for string, []byte
- ActiveClients = make(map[ClientConn]string) // map containing clients
- User = make(map[string]string)
- )
- // Initialize handlers and websocket handlers
- func init() {
- User["aaa"] = "aaa"
- User["bbb"] = "bbb"
- User["test"] = "test"
- User["test2"] = "test2"
- User["test3"] = "test3"
- }
- // Client connection consists of the websocket and the client ip
- type ClientConn struct {
- websocket *websocket.Conn
- clientIP string
- }
- // WebSocket server to handle chat between clients
- func SockServer(ws *websocket.Conn) {
- var err error
- var clientMessage string
- // use []byte if websocket binary type is blob or arraybuffer
- // var clientMessage []byte
- // cleanup on server side
- defer func() {
- if err = ws.Close(); err != nil {
- log.Println("Websocket could not be closed", err.Error())
- }
- }()
- client := ws.Request().RemoteAddr
- log.Println("Client connected:", client)
- sockCli := ClientConn{ws, client}
- ActiveClients[sockCli] = ""
- log.Println("Number of clients connected:", len(ActiveClients))
- // for loop so the websocket stays open otherwise
- // it'll close after one Receieve and Send
- for {
- if err = Message.Receive(ws, &clientMessage); err != nil {
- // If we cannot Read then the connection is closed
- log.Println("Websocket Disconnected waiting", err.Error())
- // remove the ws client conn from our active clients
- delete(ActiveClients, sockCli)
- log.Println("Number of clients still connected:", len(ActiveClients))
- return
- }
- var msg_arr = strings.Split(clientMessage, "|")
- if msg_arr[0] == "login" && len(msg_arr) == 3 {
- name := msg_arr[1]
- pass := msg_arr[2]
- if pass == User[name] {
- ActiveClients[sockCli] = name
- if err = Message.Send(ws, "login|"+name); err != nil {
- log.Println("Could not send message to ", client, err.Error())
- }
- } else {
- log.Println("login faild:", clientMessage)
- }
- } else if msg_arr[0] == "msg" {
- if ActiveClients[sockCli] != "" {
- clientMessage = "msg|" + time.Now().Format("2006-01-02 15:04:05") + " " + ActiveClients[sockCli] + " Said: " + msg_arr[1]
- for cs, na := range ActiveClients {
- if na != "" {
- if err = Message.Send(cs.websocket, clientMessage); err != nil {
- log.Println("Could not send message to ", cs.clientIP, err.Error())
- }
- }
- }
- }
- }
- }
- }
- // RootHandler renders the template for the root page
- func RootHandler(w http.ResponseWriter, req *http.Request) {
- err := RootTemp.Execute(w, listenAddr)
- if err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
- }
- }
- func main() {
- http.HandleFunc("/", RootHandler)
- http.Handle("/socket", websocket.Handler(SockServer))
- err := http.ListenAndServe(listenAddr, nil)
- if err != nil {
- panic("ListenAndServe: " + err.Error())
- }
- }
0 0
- [Golang]简单的聊天室实现
- Golang实战-一个聊天室的实现
- Golang实战-一个聊天室的实现二
- 简单聊天室的实现
- ICE:实现简单的聊天室
- websocket实现简单的聊天室
- servlet实现简单的聊天室
- Golang实现基于Websocket协议的H5聊天室
- Golang实现基于Websocket协议的H5聊天室(上)
- Golang简单的memcache实现
- Golang 实现简单的定时器
- Golang实现简单的定时器
- 用JGROUPS实现的简单聊天室
- 用ICE实现一个简单的聊天室
- 用ICE实现一个简单的聊天室
- 聊天室刷屏的简单原理实现
- 用select实现的简单聊天室
- WebSocket实现简单的web聊天室
- OpenCV学习笔记1
- uploadifive struts2实现图片上传
- 深入分析ConcurrentHashMap
- 老衣的开发工具和类库集之2014版
- 进程和线程
- [Golang]简单的聊天室实现
- java——压缩文件或者文件夹
- 虚析构函数
- 史上最简单Robotium跨进程操作实践——基于ADB框架
- 游戏程序新模块添加流程
- 时分秒换算
- 【数位DP】【HDU 4507】吉哥系列故事——恨7不成妻
- crontab经验
- 在SQLSERVER中创建DBLINK,操作远程服务器数据库