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 interface{}==nil 的几种坑及原理分析
Apr 24 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
golang的文件创建及读写操作
Apr 14 Golang
Go获取两个时区的时间差
Apr 20 Golang
Go语言编译原理之源码调试
Aug 05 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
第十二节 类的自动加载 [12]
2006/10/09 PHP
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
jquery动态加载js三种方法实例
2013/08/03 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
浅谈jQuery框架Ajax常用选项
2017/07/08 jQuery
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
jQuery中$原理实例分析
2018/08/13 jQuery
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
python抓取网页中的图片示例
2014/02/28 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
python获得文件创建时间和修改时间的方法
2015/06/30 Python
Python解析json文件相关知识学习
2016/03/01 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
思想政治教育专业个人求职信范文
2013/12/20 职场文书
会计电算化专业毕业生推荐信
2013/12/24 职场文书
银行职员个人的工作自我评价
2014/02/15 职场文书
公司担保书范文
2014/05/21 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
运动会加油稿20字
2014/11/15 职场文书
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技