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 相关文章推荐
为什么不建议在go项目中使用init()
Apr 12 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
Golang: 内建容器的用法
May 05 Golang
golang switch语句的灵活写法介绍
May 06 Golang
Golang中异常处理机制详解
Jun 08 Golang
入门学习Go的基本语法
Jul 07 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
golang语言指针操作
Apr 14 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang 实现WebSockets
Apr 24 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
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
2015/04/21 PHP
使用原生js写的一个简单slider
2014/04/29 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
深入探讨前端框架react
2015/12/09 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
python制作一个桌面便签软件
2015/08/09 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
2017/08/30 Python
python 除法保留两位小数点的方法
2018/07/16 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
Python将string转换到float的实例方法
2019/07/29 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
python中树与树的表示知识点总结
2019/09/14 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
大专毕业生自我鉴定
2013/11/21 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
敬老院活动总结
2014/04/28 职场文书
环境卫生倡议书
2014/08/29 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
地道战观后感500字
2015/06/04 职场文书
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python
python缺失值填充方法示例代码
2022/12/24 Python