golang实现一个简单的websocket聊天室

基本原理:
1.引入了 golang.org/x/net/websocket 包。
2.监听端口。
3.客户端连接时,发送结构体: {“type”:”login”,”uid”:”我是用户名”,”msg”:”登陆成功”}’ .服务端根据login信息,维护一个map,用来存放不同用户的连接体。
4.有用户发言时,将msg内容轮询发给给一个用户。
5.客户端使用js websocket功能,当作客户端,开始聊天。
不足之处:只是根据客户端传的uid来区分用户,没有进行身份校验,不过对一个demo来说,也没必要。

server代码:

package main

import (
    "encoding/json"
    "fmt"
    "golang.org/x/net/websocket"
    "log"
    "net/http"
)

//ProxyConfig 配置
type MsgConfig struct {
    Type string json:"type,omitempty"
    Uid  string json:"uid,omitempty"
    Msg  string json:"msg,omitempty"
}

var connMap = make(map[string]*websocket.Conn)

func Echo(ws *websocket.Conn) {
    var err error
    for {
        var reply string

        if err = websocket.Message.Receive(ws, &reply); err != nil {
            fmt.Println("Can't receive")
            break
        }
        replyMsg := MsgConfig{}
        json.Unmarshal([]byte(reply), &replyMsg)

        if replyMsg.Type == "login" && replyMsg.Uid != "" {
            connMap[replyMsg.Uid] = ws
            fmt.Println(connMap)
        }
        for k, v := range connMap {
            go sendMessage(replyMsg, v, k)
        }

    }
}

func sendMessage(replyMsg MsgConfig, conn *websocket.Conn, connUid string) {
    msg := replyMsg.Uid + "说:" + replyMsg.Msg
    if connUid == replyMsg.Uid {
        fmt.Println(msg)
        if replyMsg.Type == "login" {
            msg = "登陆成功"
        } else {
            msg = "你说:" + replyMsg.Msg
        }

    }
    if err := websocket.Message.Send(conn, msg); err != nil {
        fmt.Println("Can't send")
    }

}
func main() {

    http.Handle("/", websocket.Handler(Echo))

    if err := http.ListenAndServe(":1234", nil); err != nil {
        log.Fatal("ListenAndServe:", err)
    }
}

客户端聊天:
可以在浏览器的控制台里面输入以下代码,进行聊天:
//ip:port设置成自己的

ws = new WebSocket("ws://127.0.0.1:1234");
ws.onopen = function (ev) {
        ws.send('{"type":"login","uid":"我是用户名","msg":"我登陆了"}');
    };
ws.onmessage = function (ev) {
        if (ev.data){
            console.log(ev.data)
        }
};

//下面这句可以多次发送,当作是聊天。
ws.send('{"type":"msg","uid":"我是用户名","msg":"你好啊"}');

客户端效果图:

golang实现一个简单的websocket聊天室

服务器效果图:

golang实现一个简单的websocket聊天室

摘自https://www.yuanshuli.com/post-60.html

Original: https://www.cnblogs.com/cxykhaos/p/15364033.html
Author: 程序员khaos
Title: golang实现一个简单的websocket聊天室

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516574/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 第十五章:指针类型

    本篇翻译自《Practical Go Lessons》 Chapter 15: Pointer type 1 你将在本章将学到什么? 什么是指针? 什么时指针类型? 如何去创建并使…

    Go语言 2023年5月25日
    065
  • Go – 如何编写 ProtoBuf 插件 (三) ?

    上篇文章《Go – 如何编写 ProtoBuf 插件 (二) 》,分享了基于 自定义&#x90…

    Go语言 2023年5月25日
    067
  • 一次Kafka内存泄露排查经过

    一、现象 服务部署后内存总体呈上升趋势 二、排查过程 通过go tool pprof收集了三天内存数据 2月11号数据: 2月14号数据: 2月15号数据: 我们使用sarama客…

    Go语言 2023年5月25日
    061
  • golang 中 sync.Mutex 的实现

    mutex 主要有两个 method: Lock() 和 Unlock() Lock() 可以通过一个 CAS 操作来实现 func (m *Mutex) Lock() { for…

    Go语言 2023年5月25日
    074
  • 生产者消费者模型及Golang简单实现

    简介:介绍生产者消费者模型,及go简单实现的demo。 一、生产者消费者模型 生产者消费者模型:某个模块(函数等〉负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,…

    Go语言 2023年5月25日
    048
  • Go语言之高级篇beego框架之config、httplib、context

    一、httplib 1、配置文件解析 这是一个用来解析文件的库,它的设计思路来自于 database/sql,目前支持解析的文件格式有 ini、json、xml、yaml,可以通过…

    Go语言 2023年5月29日
    035
  • 浅谈MatrixOne如何用Go语言设计与实现高性能哈希表

    目录 MatrixOne数据库是什么? 哈希表数据结构基础 哈希表基本设计与对性能的影响 碰撞处理 链地址法 开放寻址法 Max load factor Growth factor…

    Go语言 2023年5月25日
    059
  • Context包源码解析(附面经)

    Context就相当于一个树状结构最后请回答一下这个问题:context包中的方法是线程安全吗? Context包中主要有一个接口和三个结构体 type Context inter…

    Go语言 2023年5月25日
    064
  • 惨,给Go提的代码被批麻了

    hello大家好,我是小楼。 不知道大家还记不记得我上次找到了一个Go的Benchmark执行会超时的Bug?就是这篇文章《我好像发现了一个Go的Bug?》。 之后我就向Go提交了…

    Go语言 2023年5月25日
    083
  • golang tcp keepalive研究记录(基于websocket)

    服务器和客户端建立tcp连接以后,客户端/服务器如何知道对方是否挂掉了? 这时候TCP协议提出一个办法,当客户端端等待超过一定时间后自动给服务端发送一个空的报文,如果对方回复了这个…

    Go语言 2023年5月25日
    053
  • go-micro集成RabbitMQ实战和原理

    在go-micro中异步消息的收发是通过Broker这个组件来完成的,底层实现有RabbitMQ、Kafka、Redis等等很多种方式,这篇文章主要介绍go-micro使用Rabb…

    Go语言 2023年5月25日
    071
  • Go语言之反射

    一、反射的基本概念 (一)什么是反射 反射可以再运行时动态获取变量的各种信息,比如变量的类型、值等 如果时结构体变量,还可以获取到结构体本身的各种信息,比如结构体的字段、方法 通过…

    Go语言 2023年5月29日
    079
  • Go语言之高级篇beego框架之日志收集系统

    一、日志收集系统架构设计 图1 图2 二、开发环境 1、安装jdk jdk-8u51-windows-x64.exe 安装目录:C:\Program Files\jdk8 2、安装…

    Go语言 2023年5月29日
    055
  • Go单元测试实践

    单元测试通常用来在日常开发中检查代码中存在的问题,是提升代码质量一种有效手段。在保证代码功能没有问题的同时,可以得到预期结果。Golang有许多优秀的框架支持UT,下面列举日常开发…

    Go语言 2023年5月25日
    073
  • Sentinel-Go 源码系列(二)|初始化流程和责任链设计模式

    上节中我们知道了 Sentinel-Go 大概能做什么事情,最简单的例子如何跑起来 其实我早就写好了本系列的第二篇,但迟迟没有发布,感觉光初始化流程显得有些单一,于是又补充了责任链…

    Go语言 2023年5月25日
    063
  • gRPC,爆赞

    gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用。 作为一名程序员,学就对了。 之前用 Python 写过一些 gRPC 服务,现在准备…

    Go语言 2023年5月25日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球