Golang 中实现实时聊天通讯

客户端代码

package mainimport ("fmt""log""net/url""os""os/signal""time""github.com/gorilla/websocket"
)func main() {interrupt := make(chan os.Signal, 1)signal.Notify(interrupt, os.Interrupt)u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/chat"}log.Printf("connecting to %s", u.String())c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)if err != nil {log.Fatal("dial:", err)}defer c.Close()done := make(chan struct{})go func() {defer close(done)for {_, message, err := c.ReadMessage()if err != nil {log.Println("read:", err)return}log.Printf("received: %s", message)}}()ticker := time.NewTicker(time.Second)defer ticker.Stop()for {select {case <-done:returncase t := <-ticker.C:err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))if err != nil {log.Println("write:", err)return}case <-interrupt:log.Println("interrupt")err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))if err != nil {log.Println("write close:", err)return}select {case <-done:case <-time.After(time.Second):}return}}
}

服务器端代码

package mainimport ("log""net/http""github.com/gorilla/websocket"
)var clients = make(map[*websocket.Conn]bool) 
var broadcast = make(chan Message)            type Message struct {Username string `json:"username"`Message  string `json:"message"`
}func main() {http.HandleFunc("/chat", handleConnections)go handleMessages()log.Println("Server started on localhost:8080")err := http.ListenAndServe(":8080", nil)if err != nil {log.Fatal("ListenAndServe: ", err)}
}func handleConnections(w http.ResponseWriter, r *http.Request) {upgrader := websocket.Upgrader{}ws, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Fatal(err)}defer ws.Close()clients[ws] = truefor {var msg Messageerr := ws.ReadJSON(&msg)if err != nil {log.Printf(": %v", err)delete(clients, ws)break}broadcast <- msg}
}func handleMessages() {for {msg := <-broadcastfor client := range clients {err := client.WriteJSON(msg)if err != nil {log.Printf(": %v", err)client.Close()delete(clients, client)}}}
}

以上代码创建了一个简单的聊天服务器和一个聊天客户端,通过 WebSocket 进行实时通信。服务器监听在 localhost:8080 上,并处理客户端连接和消息处理。客户端连接到服务器并定期发送消息。服务器接收消息并将其广播给所有已连接的客户端。

可以根据具体需求进行更多的定制和扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/18587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webpack5 学习之路

1.视频 01-课程介绍_哔哩哔哩_bilibili 2.配套资料 依赖环境 | 尚硅谷 Web 前端之 Webpack5 教程 3.webpack 官方文档 入口起点(entry points) | webpack 中文文档 4.vue cli 官方文档 介绍 | Vue CLI 挖矿&#xff1a;Coding Tree

lombok

lombok lombok是一个简化java代码编写的工具类&#xff0c;可以简化javabean的编写&#xff0c;可以通过注解的方式消除代码中的构造方法&#xff0c;getter/setter等代码&#xff0c;简化类的编写。 Lombok原理分析 Lombok核心在于对注解的解析上。JDK5引入了注解的同时&…

ES派生类的prototype方法中,不能访问super的解决方案

1 下面的B.prototype.compile方法中&#xff0c;无法访问super class A {compile() {console.log(A)} }class B extends A {compile() {super.compile()console.log(B)} }B.prototype.compile function() {super.compile() // 报错&#xff0c;不可以在此处使用superconsole.…

Spring?Boot项目如何优雅实现Excel导入与导出功能

目录 背景EasyExcel 问题分析与解决Spring Boot Excel 导入与导出 依赖引入Excel 导入 基本导入功能进阶导入功能Excel 导出 Excel 导入参数校验 开启校验 校验规则定义 Bean Validation 定义校验规则ExcelValidator 接口定义校验规则校验结果接收 异常捕获接收校验结果contro…

小研究 - 主动式微服务细粒度弹性缩放算法研究(三)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…

SDWAN组网案例——跨国游戏公司

XYZ Game Studios是一家国际知名的游戏开发公司&#xff0c;其游戏产品广受欢迎&#xff0c;拥有全球范围的玩家基础。由于游戏的在线特性和全球用户分布&#xff0c;XYZ Game Studios面临着跨国游戏服务器之间的网络连接和稳定性问题。他们希望提供更稳定、高效的游戏体验&…

使用 Go 语言实现二叉搜索树

原文链接&#xff1a; 使用 Go 语言实现二叉搜索树 二叉树是一种常见并且非常重要的数据结构&#xff0c;在很多项目中都能看到二叉树的身影。 它有很多变种&#xff0c;比如红黑树&#xff0c;常被用作 std::map 和 std::set 的底层实现&#xff1b;B 树和 B 树&#xff0c;…

Total Variation loss

Total Variation loss 适合任务 图像复原、去噪等 处理的问题 图像上的一点点噪声可能就会对复原的结果产生非常大的影响&#xff0c;很多复原算法都会放大噪声。因此需要在最优化问题的模型中添加一些正则项来保持图像的光滑性&#xff0c;图片中相邻像素值的差异可以通过…

使用 Webpack 优化前端开发流程

在现代前端开发中&#xff0c;构建工具的选择和优化流程的设计至关重要。Webpack 是一个功能强大的前端构建工具&#xff0c;能够优化我们的开发流程&#xff0c;提高开发效率和项目性能。本文将介绍如何使用 Webpack 来优化前端开发流程。 代码优化和资源管理也是前端项目中不…

传统计算机视觉

传统计算机视觉 计算机视觉难点图像分割基于主动轮廓的图像分割基于水平集的图像分割交互式图像分割基于模型的运动分割 目标跟踪基于光流的点目标跟踪基于均值漂移的块目标跟踪基于粒子滤波的目标跟踪基于核相关滤波的目标跟踪 目标检测一般目标检测识别之特征一般目标检测识别…

18.Netty源码之ByteBuf 详解

highlight: arduino-light ByteBuf 是 Netty 的数据容器&#xff0c;所有网络通信中字节流的传输都是通过 ByteBuf 完成的。 然而 JDK NIO 包中已经提供了类似的 ByteBuffer 类&#xff0c;为什么 Netty 还要去重复造轮子呢&#xff1f;本节课我会详细地讲解 ByteBuf。 JDK NIO…

Spring学习记录----十五、面向切面编程AOP+十六、Spring对事务的支持

目录 十五、面向切面编程AOP 15.1 AOP介绍 总结 15.2 AOP的七大术语 15.3 切点表达式 15.4 使用Spring的AOP 15.4.1 准备工作 15.4.1.1Spring AOP 基于注解之实现步骤 15.4.1.2-Spring AOP 基于注解之切点表达式 代码 运行结果&#xff1a; 代码 运行结果 通知类…

Python高阶技巧 递归

递归的定义 函数作为一种代码封装&#xff0c;可以被其他程序调用&#xff0c;当然&#xff0c;也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。 递归的思想 把规模大的问题转化为规模小的、具有与原来问题相同解法的问题来解决。在函数实现时&#…

SpringBoot集成Thymeleaf

Spring Boot 集成 Thymeleaf 模板引擎 1、Thymeleaf 介绍 Thymeleaf 是适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 Thymeleaf 的主要目标是为开发工作流程带来优雅的自然模板&#xff0c;既可以在浏览器中正确显示的 HTML&#xff0c;也可以用作静态原型&#xf…

C#+WPF上位机开发(模块化+反应式)

在上位机开发领域中&#xff0c;C#与C两种语言是应用最多的两种开发语言&#xff0c;在C语言中&#xff0c;与之搭配的前端框架通常以QT最为常用&#xff0c;而C#语言中&#xff0c;与之搭配的前端框架是Winform和WPF两种框架。今天我们主要讨论一下C#和WPF这一对组合在上位机开…

后台生成验证码的方法,验证码相关

1、后台生成验证码的方法 /**** [验证码生成] [验证码生成]base64*/RequestMapping(value "/getverifycode", method RequestMethod.POST)public String getVerifyCode(RequestBody String param) {try {Integer codeLength Integer.parseInt("4");Int…

css图标 | 来自 fontawesome 字体文件的586 个小图标

1. css效果 /*!* Font Awesome 4.4.0 by davegandy - http://fontawesome.io - fontawesome* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)*/.fa-glass:before {content:"\f000"} .fa-music:before {content:"\f001"…

Nginx配置https链接跳转http

由于项目中实际用的http进行发布访问&#xff0c;网址链接没有指定为http类型&#xff0c;导致某些场景下打开链接是https方式进行访问&#xff0c;就会显示404错误&#xff0c;没法正常访问。 为了解决这种情况&#xff0c;需要进行Nginx配置&#xff0c;浏览器以https进行访…

小白如何理解MySQL?一文吃透

从本质上来说&#xff0c;MySQL也是一个软件&#xff0c;以Java为例&#xff0c;Java通过JDBC进行MySQL驱动连接后&#xff0c;通过调用“MySQL”的“接口”将SQL语句传给MySQL&#xff0c;并获取返回结果&#xff01; 连接器 第一步&#xff0c;你会先连接到这个数据库上&…

el-upload 上传视频并回显

el-upload上传视频&#xff0c;并且显示上传的视频 <el-form-item><label slot"label"><span style"color:#F56C6C">*</span> 视频</label><el-upload class"upload-demo" style"width:360px" :act…