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如何去除多余空白字符(含制表符)
Apr 25 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
golang中的并发和并行
May 08 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
golang生成并解析JSON
Apr 14 Golang
Golang 实现WebSockets
Apr 24 Golang
go goth封装第三方认证库示例详解
Aug 14 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获得文件扩展名三法
2006/11/25 PHP
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
php开发环境配置记录
2011/01/14 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
PHP中Fatal error session_start()错误解决步骤
2014/08/05 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
laravel学习教程之存取器
2016/07/30 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
Vue.js表单控件实践
2016/10/27 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
python局部赋值的规则
2013/03/07 Python
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
python基于pygame实现响应游戏中事件的方法(附源码)
2015/11/11 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
python实现音乐下载的统计
2018/06/20 Python
Django对models里的objects的使用详解
2019/08/17 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
Python中return函数返回值实例用法
2020/11/19 Python
2014大学生全国两会学习心得体会
2014/03/13 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
师范生见习报告范文
2014/11/03 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书