先说点无关的,最近忙于工作没有更新博客,今天休息顺便把golang websocket研究了一下,挺好玩的,写了一个聊天室,分享给大家.
websocket包 : code.google.com/p/go.net/websocket
文档 : http://go.pkgdoc.org/code.google.com/p/go.net/websocket
首先安装websocket包
go get code.google.com/p/go.net/websocket
下来就是聊天室代码了,呵呵
golang websocket 聊天室
package main import ( "fmt" "io" "bufio" "net/http" "code.google.com/p/go.net/websocket" "container/list" ) var connid int var conns *list.List func ChatroomServer(ws *websocket.Conn) { defer ws.Close() connid++ id := connid fmt.Printf("connection id: %d\n", id) item := conns.PushBack(ws) defer conns.Remove(item) name := fmt.Sprintf("user%d", id) SendMessage(nil, fmt.Sprintf("welcome %s join\n", name)) r := bufio.NewReader(ws) for { data, err := r.ReadBytes('\n') if err != nil { fmt.Printf("disconnected id: %d\n", id) SendMessage(item, fmt.Sprintf("%s offline\n", name)) break } fmt.Printf("%s: %s", name, data) SendMessage(item, fmt.Sprintf("%s\t> %s", name, data)) } } func SendMessage(self *list.Element, data string) { // for _, item := range conns { for item := conns.Front(); item != nil; item = item.Next() { ws, ok := item.Value.(*websocket.Conn) if !ok { panic("item not *websocket.Conn") } if item == self { continue } io.WriteString(ws, data) } } // 网页客户端 func Client(w http.ResponseWriter, r *http.Request) { html := `<!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>golang websocket chatroom</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> <script> var ws = new WebSocket("ws://127.0.0.1:6611/chatroom"); ws.onopen = function(e){ console.log("onopen"); console.dir(e); }; ws.onmessage = function(e){ console.log("onmessage"); console.dir(e); $('#log').append('<p>'+e.data+'<p>'); $('#log').get(0).scrollTop = $('#log').get(0).scrollHeight; }; ws.onclose = function(e){ console.log("onclose"); console.dir(e); }; ws.onerror = function(e){ console.log("onerror"); console.dir(e); }; $(function(){ $('#msgform').submit(function(){ ws.send($('#msg').val()+"\n"); $('#log').append('<p style="color:red;">My > '+$('#msg').val()+'<p>'); $('#log').get(0).scrollTop = $('#log').get(0).scrollHeight; $('#msg').val(''); return false; }); }); </script> </head> <body> <div id="log" style="height: 300px;overflow-y: scroll;border: 1px solid #CCC;"> </div> <div> <form id="msgform"> <input type="text" id="msg" size="60" /> </form> </div> </body> </html>` io.WriteString(w, html) } func main() { fmt.Printf(`Welcome chatroom server! author: dotcoo zhao url: http://www.dotcoo.com/golang-websocket-chatroom `) connid = 0 conns = list.New() http.Handle("/chatroom", websocket.Handler(ChatroomServer)); http.HandleFunc("/", Client); err := http.ListenAndServe(":6611", nil); if err != nil { panic("ListenAndServe: " + err.Error()) } }
简陋了些,但是基本功能都有了.
golang websocket 客户端
package main import ( "fmt" "bufio" "io" "os" "code.google.com/p/go.net/websocket" ) func Command(ws *websocket.Conn) { r := bufio.NewReader(os.Stdin) w := bufio.NewWriter(ws) for { data, err := r.ReadBytes('\n') if err != nil { panic(err) } _, err = w.Write(data) if err != nil { panic(err) } w.Flush() fmt.Printf("My\t> ") } } func main() { fmt.Printf(`Welcome chatroom! author: dotcoo zhao url: http://www.dotcoo.com/golang-websocket-chatroom `) origin := "http://127.0.0.1:6611/" url := "ws://127.0.0.1:6611/chatroom" ws, err := websocket.Dial(url, "", origin) if err != nil { panic(err) } defer ws.Close() r := bufio.NewReader(ws) //w := bufio.NewWriter(os.Stdout) go Command(ws) for { data, err := r.ReadBytes('\n') if err == io.EOF { fmt.Printf("disconnected\n") os.Exit(0) } if err != nil { panic(err) } fmt.Printf("\r%sMy\t> ", data) } }
相关推荐
【Golang 搭建 Web 聊天室】是一个关于使用 Go 语言构建实时通信应用的教程,重点是利用 WebSocket 协议实现一个在线聊天室。WebSocket 是一种在 Web 端支持双向通信的协议,它克服了 HTTP 的单向传输限制,允许...
本文将介绍如何实现一个基于websocket聊天室(IM)分布式系统。 使用golang实现websocket通讯,单机支持百万连接,使用gin框架,nginx负载,可以水平部署,程序内部相互通讯,使用grpc通讯协议。 一般项目中...
### Golang 基于 WebSocket 实现的简易聊天室程序详解 #### 一、引言 随着互联网技术的发展,实时通信的需求越来越广泛。WebSocket 作为一种在单个 TCP 连接上进行全双工通信的协议,能够实现实时的数据交换。本篇...
在本文中,我们将深入探讨如何使用Golang语言和beego框架构建一个基于Websocket的即时聊天应用程序。beego是一个强大的Go Web开发框架,它提供了一种简洁的方式来快速搭建Web应用,而Websocket则是一种在客户端和...
这是一个基于 Gin 框架和 WebSocket 实现的简单聊天室应用程序。它使用了 MySQL 数据库保存用户信息和聊天记录,并使用 Gorilla WebSocket 库实现了 WebSocket 通信。 主要功能: * 用户注册和登录 * 用户通过 ...
golang websocket demo,go
创建一个websocket的服务端 package smile import ( errors log net/http sync time github.com/gorilla/websocket ) const ( // 允许等待的写入时间 writeWait = 10 * time.Second // Time allowed to ...
一个非常简洁的 Golang Websocket 推送中心 Demo,代码清晰易懂。 功能: 1. 客户端登录到 websocket 推送中心,用户认证 2. 服务端给客户端推送消息,只需要通过 HTTP 接口。 如果你想学习 Golang 或者用 Golang ...
相比于HTTP协议,WebSocket更适合实时通信场景,如在线游戏、股票交易、聊天应用等。 在Go语言中,我们可以利用标准库`net/http`和第三方库如`gorilla/websocket`来实现WebSocket代理服务器。`gorilla/websocket`是...
安装go revel框架的时候,golang.com/x/net中的包总是下不下来。放在这里方便大家使用。具体的使用方法就不累赘了,如有问题请给我发信。
下载并构建websocket-tester go get github.com/wtmmac/websocket-tester用法./websocket-tester的用法: -i = 10:启动websocketTester的间隔(单位:毫秒) -n = 1:要执行的请求数-ws =“ ws:// localhost:7001...
Golang,通常被称为Go语言,是一种由谷歌开发的编程语言。它以简洁、高效、安全著称,并且非常适合构建大规模的分布式系统和微服务。Go语言的一些主要特点包括: 1. **简洁性**:Go语言的语法非常简单,易于学习。 ...
在本项目中,我们利用了Golang的Gin框架和Websocket技术来构建了一个功能完善的多人聊天室。Gin是一个轻量级的Web框架,它提供了简洁、高效的API路由,使得开发过程更加便捷。Websocket则是一种在客户端和服务器之间...
这使得WebSocket成为构建实时通信应用的理想选择,如聊天应用、实时游戏或实时数据更新服务。Golang原生支持WebSocket,并且通过其标准库net/http中的http.ServeMux可以轻松实现WebSocket服务器和客户端。 Golang...
基于Golang+WebSocket+Canvas+Protobuf 的聊天室+源码解析+项目解析+运行教程,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 特色 支持性别修改、...
总的来说,Golang写的推技术聊天室是一个很好的实践项目,可以帮助开发者深入理解Golang的并发特性、WebSocket通信以及服务器端的实时数据推送。通过这个项目,你可以学到如何利用Golang的强大功能构建高效、可靠的...