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 Int转string几种方式性能测试
Apr 28 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Golang 遍历二叉树
Apr 19 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Go web入门Go pongo2模板引擎
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中使用array函数新建一个数组
2015/11/19 PHP
3种php生成唯一id的方法
2015/11/23 PHP
php错误日志简单配置方法
2016/07/11 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
js实现最短的XML格式化工具实例
2015/03/12 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
简单的网页广告特效实例
2017/08/19 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
vue resource发送请求的几种方式
2019/09/30 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
优秀求职自荐信怎样写
2013/12/18 职场文书
预备党员自我评价范文
2015/03/04 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
mysql知识点整理
2021/04/05 MySQL
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
使用CSS设置滚动条样式
2022/01/18 HTML / CSS