`
DarkWingBoy
  • 浏览: 50274 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

golang websocket 简易聊天室

 
阅读更多

先说点无关的,最近忙于工作没有更新博客,今天休息顺便把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 聊天室

    【Golang 搭建 Web 聊天室】是一个关于使用 Go 语言构建实时通信应用的教程,重点是利用 WebSocket 协议实现一个在线聊天室。WebSocket 是一种在 Web 端支持双向通信的协议,它克服了 HTTP 的单向传输限制,允许...

    gowebsocket:golang基于websocket单台机器支持百万连接分布式聊天(IM)系统

    本文将介绍如何实现一个基于websocket聊天室(IM)分布式系统。 使用golang实现websocket通讯,单机支持百万连接,使用gin框架,nginx负载,可以水平部署,程序内部相互通讯,使用grpc通讯协议。 一般项目中...

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

    ### Golang 基于 WebSocket 实现的简易聊天室程序详解 #### 一、引言 随着互联网技术的发展,实时通信的需求越来越广泛。WebSocket 作为一种在单个 TCP 连接上进行全双工通信的协议,能够实现实时的数据交换。本篇...

    Golang语言基于beego框架的websocket即时聊天

    在本文中,我们将深入探讨如何使用Golang语言和beego框架构建一个基于Websocket的即时聊天应用程序。beego是一个强大的Go Web开发框架,它提供了一种简洁的方式来快速搭建Web应用,而Websocket则是一种在客户端和...

    web 聊天室程序(应用go、html、js、css, gin、websocket)

    这是一个基于 Gin 框架和 WebSocket 实现的简单聊天室应用程序。它使用了 MySQL 数据库保存用户信息和聊天记录,并使用 Gorilla WebSocket 库实现了 WebSocket 通信。 主要功能: * 用户注册和登录 * 用户通过 ...

    golang websocket demo

    golang websocket demo,go

    golang websocket 服务端的实现

    创建一个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,代码清晰易懂

    一个非常简洁的 Golang Websocket 推送中心 Demo,代码清晰易懂。 功能: 1. 客户端登录到 websocket 推送中心,用户认证 2. 服务端给客户端推送消息,只需要通过 HTTP 接口。 如果你想学习 Golang 或者用 Golang ...

    go语言写的websocket代理服务器

    相比于HTTP协议,WebSocket更适合实时通信场景,如在线游戏、股票交易、聊天应用等。 在Go语言中,我们可以利用标准库`net/http`和第三方库如`gorilla/websocket`来实现WebSocket代理服务器。`gorilla/websocket`是...

    golang websocket

    安装go revel框架的时候,golang.com/x/net中的包总是下不下来。放在这里方便大家使用。具体的使用方法就不累赘了,如有问题请给我发信。

    websocket-tester:Golang WebSocket客户端,可启动大量WebSocket连接以进行测试

    下载并构建websocket-tester go get github.com/wtmmac/websocket-tester用法./websocket-tester的用法: -i = 10:启动websocketTester的间隔(单位:毫秒) -n = 1:要执行的请求数-ws =“ ws:// localhost:7001...

    Golang Websocket实战:深入理解与实现

    Golang,通常被称为Go语言,是一种由谷歌开发的编程语言。它以简洁、高效、安全著称,并且非常适合构建大规模的分布式系统和微服务。Go语言的一些主要特点包括: 1. **简洁性**:Go语言的语法非常简单,易于学习。 ...

    Golang(Gin框架)+websocket 实现的多人聊天室+代码+详细文档

    在本项目中,我们利用了Golang的Gin框架和Websocket技术来构建了一个功能完善的多人聊天室。Gin是一个轻量级的Web框架,它提供了简洁、高效的API路由,使得开发过程更加便捷。Websocket则是一种在客户端和服务器之间...

    深入Golang的WebSocket实现:构建实时通信应用

    这使得WebSocket成为构建实时通信应用的理想选择,如聊天应用、实时游戏或实时数据更新服务。Golang原生支持WebSocket,并且通过其标准库net/http中的http.ServeMux可以轻松实现WebSocket服务器和客户端。 Golang...

    基于Golang+WebSocket+Canvas+Protobuf 的聊天室+源码解析+项目解析+运行教程(高分优秀项目)

    基于Golang+WebSocket+Canvas+Protobuf 的聊天室+源码解析+项目解析+运行教程,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 特色 支持性别修改、...

    golang写的推技术聊天室

    总的来说,Golang写的推技术聊天室是一个很好的实践项目,可以帮助开发者深入理解Golang的并发特性、WebSocket通信以及服务器端的实时数据推送。通过这个项目,你可以学到如何利用Golang的强大功能构建高效、可靠的...

Global site tag (gtag.js) - Google Analytics