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中semaphore(信号量)源码
Apr 03 Golang
golang判断key是否在map中的代码
Apr 24 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
go类型转换及与C的类型转换方式
May 05 Golang
go 实现简易端口扫描的示例
May 22 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Go并发4种方法简明讲解
Apr 06 Golang
golang语言指针操作
Apr 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
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
PHP中将网页导出为Word文档的代码
2012/05/25 PHP
php模拟js函数unescape的函数代码
2012/10/20 PHP
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
浅析THINKPHP的addAll支持的最大数据量
2015/02/03 PHP
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
JavaScript基本对象
2007/01/11 Javascript
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
使用vue-router切换页面时,获取上一页url以及当前页面url的方法
2019/05/06 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
vue实现户籍管理系统
2020/05/29 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
python处理大数字的方法
2015/05/27 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
大学生职业生涯规划书
2014/03/14 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
行政复议答复书
2015/07/01 职场文书
中学图书馆工作总结
2015/08/11 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android