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 interface判断为空nil的实现代码
Apr 24 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
Golang: 内建容器的用法
May 05 Golang
golang 实现时间戳和时间的转化
May 07 Golang
golang 实现并发求和
May 08 Golang
Golang二维数组的使用方式
May 28 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
golang内置函数len的小技巧
Jul 25 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
实现GO语言对数组切片去重
Apr 20 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
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
php循环输出数据库内容的代码
2008/05/24 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
jquery遍历input取得input的name
2009/04/27 Javascript
jQuery MD5加密实现代码
2010/03/15 Javascript
javascript插入样式实现代码
2012/02/22 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
python实现中文分词FMM算法实例
2015/07/10 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
详解Python是如何实现issubclass的
2019/07/24 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
计算机售后服务承诺书
2014/05/30 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
单位员工收入证明样本
2014/10/09 职场文书
2014年司机工作总结
2014/11/21 职场文书
超市啤酒狂欢夜策划方案范文!
2019/07/03 职场文书
Python异常类型以及处理方法汇总
2021/06/05 Python
MySQL8.0的WITH查询详情
2021/08/30 MySQL
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL