golang基于websocket实现的简易聊天室程序
本文实例讲述了golang基于websocket实现的简易聊天室。分享给大家供大家参考,具体如下:
创新互联公司是专业的巩义网站建设公司,巩义接单;提供网站设计制作、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行巩义网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
先说点无关的,最近忙于工作没有更新博客,今天休息顺便把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 := `
golang websocket chatroom
`
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())
}
}
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 := `
`
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)
}
}
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)
}
}
希望本文所述对大家Go语言程序设计有所帮助。
名称栏目:golang基于websocket实现的简易聊天室程序
标题来源:http://ybzwz.com/article/pijsse.html