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


Posted in Golang onOctober 05, 2021

基本原理:
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

到此这篇关于golang实现一个简单的websocket聊天室的文章就介绍到这了,更多相关golang websocket聊天室内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
win10下go mod配置方式
Apr 25 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
golang 实现并发求和
May 08 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
golang内置函数len的小技巧
Jul 25 Golang
golang为什么要统一错误处理
Apr 03 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Go并发4种方法简明讲解
Apr 06 Golang
Golang 入门 之url 包
May 04 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
深入理解go slice结构
Sep 15 #Golang
Golang表示枚举类型的详细讲解
golang 语言中错误处理机制
Aug 30 #Golang
Golang并发操作中常见的读写锁详析
Aug 30 #Golang
Go中的条件语句Switch示例详解
Aug 23 #Golang
Go Plugins插件的实现方式
Aug 07 #Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 #Golang
You might like
如何利用php+mysql保存和输出文件
2006/10/09 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
python中查找excel某一列的重复数据 剔除之后打印
2013/02/10 Python
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
Python list操作用法总结
2015/11/10 Python
Python操作MongoDB详解及实例
2017/05/18 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
Python模块相关知识点小结
2020/03/09 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
蔻驰法国官网:COACH法国
2018/11/14 全球购物
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
数控个人求职信范文
2014/02/03 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
销售会计岗位职责
2014/03/15 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
三方协议书范本
2014/04/22 职场文书
小学校园之星事迹材料
2014/05/16 职场文书
经理岗位职责
2015/02/02 职场文书
研究生个人学年总结
2015/02/14 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
Java使用HttpClient实现文件下载
2022/08/14 Java/Android