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
Go语言中的UTF-8实现
Apr 26 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
golang 实现时间戳和时间的转化
May 07 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Go并发4种方法简明讲解
Apr 06 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
Go语言入门exec的基本使用
May 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
PHP 变量类型的强制转换
2009/10/23 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
可以用鼠标拖动的DIV实现思路及代码
2013/10/21 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
JS百度地图搜索悬浮窗功能
2017/01/12 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
jQuery Datatables 动态列+跨列合并实现代码
2020/01/30 jQuery
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
替换python字典中的key值方法
2018/07/06 Python
Python之循环结构
2019/01/15 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
python psutil监控进程实例
2019/12/17 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
Django 实现图片上传和下载功能
2020/12/31 Python
网游商务专员求职信
2013/10/15 职场文书
运动会四百米广播稿
2014/01/19 职场文书
读群众路线心得体会
2014/03/07 职场文书
基层党支部公开承诺书
2014/05/29 职场文书
护校行动方案
2014/05/31 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
导游词之包公祠
2019/11/25 职场文书
简单了解 MySQL 中相关的锁
2021/05/25 MySQL