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判断key是否在map中的代码
Apr 24 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
golang http使用踩过的坑与填坑指南
Apr 27 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
golang goroutine顺序输出方式
Apr 29 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
golang 实现并发求和
May 08 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go获取两个时区的时间差
Apr 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:风雨欲来 路在何方?
2006/10/09 PHP
一个PHP并发访问实例代码
2012/09/06 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
php中final关键字用法分析
2016/12/07 PHP
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
juqery 学习之三 选择器 简单 内容
2010/11/25 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
Javascript Function.prototype.bind详细分析
2016/12/29 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
bootstrap table列和表头对不齐的解决方法
2019/07/19 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
小程序接入腾讯位置服务的详细流程
2020/03/03 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
python七夕浪漫表白源码
2019/04/05 Python
python如何提取英语pdf内容并翻译
2020/03/03 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
Python中return函数返回值实例用法
2020/11/19 Python
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
日本食品网上商店:JaponShop.com
2017/11/28 全球购物
墨西哥网上超市:Superama
2018/07/10 全球购物
Oracle性能调优原则
2012/05/03 面试题
介绍一下Java中的static关键字
2012/05/12 面试题
商场消防演习方案
2014/02/12 职场文书
拓展策划方案
2014/06/03 职场文书
化工专业求职信
2014/07/01 职场文书
工程部文员岗位职责
2015/02/04 职场文书
初中毕业感言300字
2015/07/31 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
使用feign服务调用添加Header参数
2021/06/23 Java/Android
解决xampp安装后Apache无法启动
2022/03/21 Servers
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL