好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

golang基于websocket实现的简易聊天室程序

本文实例讲述了golang基于websocket实现的简易聊天室。分享给大家供大家参考,具体如下:

先说点无关的,最近忙于工作没有更新博客,今天休息顺便把golang websocket研究了一下,挺好玩的,写了一个聊天室,分享给大家.

websocket包 : code.google测试数据/p/go.net/websocket

文档 : http://go.pkgdoc.org/code.google测试数据/p/go.net/websocket

首先安装websocket包

复制代码 代码如下:

go get code.google测试数据/p/go.net/websocket

下来就是聊天室代码了,呵呵

golang websocket 聊天室

复制代码 代码如下:

package main
import (
??? "fmt"
??? "io"
??? "bufio"
??? "net/http"
??? "code.google测试数据/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
???
???
??????? 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('

'+e.data+'

');
??????????? $('#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('

My > '+$('#msg').val()+'

');
??????????????? $('#log').get(0).scrollTop = $('#log').get(0).scrollHeight;
??????????????? $('#msg').val('');
??????????????? return false;
??????????? });
??????? });
???


???


???


???


???????
???????????
???????
???



`
??? io.WriteString(w, html)
}
func main() {
??? fmt.Printf(`Welcome chatroom server!
author: dotcoo zhao
url: http://HdhCmsTestdotcoo测试数据/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测试数据/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://HdhCmsTestdotcoo测试数据/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实现的简易聊天室程序的详细内容...

  阅读:76次