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 相关文章推荐
golang在GRPC中设置client的超时时间
Apr 27 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
golang 实现时间戳和时间的转化
May 07 Golang
Golang二维数组的使用方式
May 28 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang bufio详细讲解
Apr 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多任务程序实例解析
2014/07/19 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
yii2中关于加密解密的那些事儿
2018/06/12 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
Bootstrap中CSS的使用方法
2016/02/17 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
简单介绍Ruby中的CGI编程
2015/04/10 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
如何写python的配置文件
2020/06/07 Python
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
如何写毕业求职自荐信
2013/11/06 职场文书
人事专员岗位职责
2013/11/20 职场文书
车工岗位职责
2013/11/26 职场文书
便利店投资的创业计划书
2014/01/12 职场文书
毕业生自我鉴定实例
2014/01/21 职场文书
酒后驾驶检讨书
2014/01/27 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
辞职信标准格式
2015/02/27 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
通知怎么写?
2019/04/17 职场文书
Mysql文件存储图文详解
2021/06/01 MySQL
Vue监视数据的原理详解
2022/02/24 Vue.js