分享
  1. 首页
  2. 文章

golang websocket 聊天室demo

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

近期偶然的机会看到一些go的websocket技术方案,顺便写了个demo,玩了一下:

首先安装websocket包

go get code.google.com/p/go.net/websocket

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="https://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)

}

}

总体下来还是挺简单的,效果还不错。大家可以试试看。呵呵


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

本文来自:博客园

感谢作者:bozhang

查看原文:golang websocket 聊天室demo

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

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

用户登录

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

今日阅读排行

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

一周阅读排行

    加载中

关注我

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

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

给该专栏投稿 写篇新文章

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

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