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 上,并处理客户端连接和消息处理。客户端连接到服务器并定期发送消息。服务器接收消息并将其广播给所有已连接的客户端。
可以根据具体需求进行更多的定制和扩展。
相关文章:
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.Interr…...
前端面试的性能优化部分(5)每天10个小知识点
目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…...
【链表OJ 1】移除链表元素val
大家好,欢迎来到我的博客,此题是关于链表oj的第一题,此后还会陆续更新博客,如有错误,欢迎大家指正。 来源:https://leetcode.cn/problems/remove-linked-list-elements/description/ 题目: 方法一:定义prev和cur指针…...
复原 IP 地址——力扣93
文章目录 题目描述回溯题目描述 回溯 class Solution{public:static constexpr int seg_count=4<...
OSPF综合实验
实验题目如下: 实验拓扑如下: 实验要求如下: 【1】R4为ISP,其上只能配置IP地址: R4与其他所有直连设备间使用公有 【2】R3---R5/6/7为MGRE环境,R3为中心站点 【3】整个OSPF环境IP地址为172.16.0.0/16 【4】所有设备…...
安卓4G核心板开发板_MTK6785/MT6785(Helio G95)安卓手机主板方案
联发科MTK6785(Helio G95)安卓核心板采用八核 CPU 具有两个强大的 Arm Cortex-A76 处理器内核,主频高达 2.05GHz,外加六个 Cortex-A55 高效处理器。其强大的图形性能由 Arm Mali-G76 MC4 提供,速度可提升至 900MHz 。 …...
Linux 匿名页的生命周期
目录 匿名页的生成 匿名页生成时的状态 do_anonymous_page缺页中断源码 从匿名页加入Inactive lru引出 一个非常重要内核patch 匿名页何时回收 本文以Linux5.9源码讲述 匿名页的生成 用户空间malloc/mmap(非映射文件时)来分配内存,在内核空间发生…...
设计模式概述与UML图
文章目录 一、设计模式概述1. 软件设计模式的产生背景2. 软件设计模式的概念3. 学习设计模式的必要性4. 设计模式分类(1)创建型模式(2)结构型模式(3)行为型模式 二、UML图1. 类图概述2. 类图作用3. 类图表示…...
使用Vscode编辑keil工程
一、需要安装的插件 1. Keil Assistant 2. C/C 3. 中文配置: 二、插件配置 1. Keil Assistant 添加Keil的安装路径 接下来就可以使用vscode编辑Keil的工程了,调试编译和下载程序需要返回到Keil中进行操作。 三、Vscode常用快捷键 可以自定义进行配置…...
编译工具:CMake(一) | 简介与安装
编译工具:CMake(一) | 简介与安装 1. CMake简介1.1CMake的特点 2. CMake 安装 这个是CMake的图标 1. CMake简介 cmake 是 kitware 公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一…...
深度学习(34)—— StarGAN(1)
深度学习(34)—— StarGAN(1) 文章目录 深度学习(34)—— StarGAN(1)1. 背景2. 基本思路3. 整体流程4. StarGAN v2(1) 网络结构(2) mapping network(3) style encoder(4)Loss 和之前…...
ES6系列之let、const、箭头函数使用的坑
变量提升块级作用域的重要性箭头函数this的指向rest参数和arguments 1.ECMAScript与Js的关系 2.Babel转码器 Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在老版本的浏览器执行。这意味着,你可以用ES6的方式编写程序&…...
4.DNS和负载均衡
文章目录 coreDNS概念部署croeDNS测试 kubernetes多master集群结构master节点部署 负载均衡配置部署nginx做四层反向代理安装高可用 keepalivednginx监控脚本修改k8s中组件的配置文件 coreDNS 概念 coreDNS是kubernetes的默认DNS实现。可以为集群中的service资源创建一个资源名…...
【JavaEE进阶】Spring核心与设计思想
文章目录 一. Spring框架概述1. 什么是Spring框架2. 为什么要学习框架?3. Spring框架学习的难点 二. Spring 核心与设计思想1. 什么是容器?2. 什么是IoC?3. Spring是IoC容器4. DI(依赖注入)5. DL(依赖查找) 一. Spring框架概述…...
实习周记第三周
第二周总结 第二周主要是做了一些PC端细节内容。大的地方改的不多,但是小的细节蛮多。 值得一提的是,第二周做的微信小程序,改了很多逻辑。改逻辑需要与后端进行联调,收获很大,思路也愈发清楚。 记录做了什么是好习…...
11. 使用tomcat中碰到的一些问题
文章目录 问题一:Tomcat的startup.bat启动后出现乱码问题二:一闪而退之端口占用问题三:非端口问题的一闪而退问题四:服务器的乱码和跨域问题问题五: 在tomcat\webapps\下创建文件夹为什么tomcat重启就会丢失问题六:Tom…...
C++解决TCP粘包
目录 TCP粘包问题TCP客户端TCP服务端源码测试 TCP粘包问题 TCP是面向连接的,面向流的可靠性传输。TCP会将多个间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包发送,这样一个数据包里就可能含有多个消息的数据&#…...
最长快乐前缀——力扣1392
文章目录 题目描述KMP题目描述 KMP class Solution {public:string longestPrefix(string s) {int n = s...
使用java.util.List的containsAll()方法可能导致的问题
今天在偶然之间发现了一个bug,原因居然是使用了containsAll()方法,这个问题很简单,看以下代码就能发现很大的问题。 package collection;import java.util.ArrayList; import java.util.List;/*** author heyunlin* version 1.0*/ public cl…...
在线文本转语音播放 (TTS)
具体请前往:在线文本转语音播放(TTS)...
精益生产线功能拆解:如何利用精益生产线解决多品种小批量生产难题
在当前的制造业环境中,订单碎片化已成为常态,精益生产线不再是一个可选的优化项,而是企业生存的必修课。面对多品种、小批量的市场需求,传统的大批量流水线往往显得笨重不堪,频繁换型导致的停机、在制品积压造成的资金…...
告别原生IDE!用HBuilderX 3.6.8+和UTS插件5分钟搞定安卓Toast功能
5分钟解锁安卓Toast:HBuilderXUTS插件的高效开发实战 还在为Android Studio的臃肿和配置繁琐头疼?UniApp开发者现在有了更优雅的选择。想象一下:用熟悉的TypeScript语法直接调用原生API,无需切换开发环境,5分钟实现安卓…...
浅谈MIKEURBAN计算进度条停止的解决方法
01 问题昨天晚上,一个同事拿着笔记本对着我说,为什么我的MIKE URBAN计算进度条一直停滞在5%,停止了。我说是不是兼容问题,要不重新安装下软件吧。最终还是很感谢某同事找到了解决方法。02 解决方法MIKE URBAN低版本的通常分为了32…...
【数值分析】线性方程组求解的MATLAB实战:从高斯消元到追赶法
1. 线性方程组求解的数值方法概述 在工程计算和科学研究中,线性方程组的求解是一个基础而重要的问题。想象一下,你正在设计一座桥梁,需要计算各个节点的受力情况;或者你在分析电路时,需要确定各个支路的电流大小。这些…...
dig (Domain Information Groper):从命令行到自动化运维的DNS探秘
1. 从命令行工具到运维利器的dig进化史 第一次接触dig命令时,我正被一个诡异的域名解析问题困扰。当时作为新手运维,只会用ping和nslookup反复测试,直到同事甩给我一行dig trace example.com——瞬间看到了完整的DNS解析链条,那种…...
React - useEffect、useRef、Fragment
一、useEffect 1、基本介绍 useEffect 用于在函数式组件中执行副作用操作,用于替代类组件中的生命周期钩子 useEffect(() > {// 副作用操作return () > {// 清理函数(可选)}; }, [依赖项数组]);副作用操作:发送请求数据获取…...
Atmosphere:重新定义Nintendo Switch自制固件的革命性框架
Atmosphere:重新定义Nintendo Switch自制固件的革命性框架 【免费下载链接】Atmosphere Atmosphre is a work-in-progress customized firmware for the Nintendo Switch. 项目地址: https://gitcode.com/GitHub_Trending/at/Atmosphere 你是否曾想过&#x…...
OpCore-Simplify:如何将黑苹果EFI配置从3小时缩短到15分钟?
OpCore-Simplify:如何将黑苹果EFI配置从3小时缩短到15分钟? 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在开源系统定制领域…...
施密特触发器在智能家居中的7个隐藏用法:从空调变频到漏电保护
施密特触发器在智能家居中的7个隐藏用法:从空调变频到漏电保护 智能家居的普及让我们的生活更加便捷,但背后支撑这些设备的电子技术却鲜为人知。施密特触发器作为一种基础的电子元件,在智能家居系统中扮演着关键角色。它不仅能解决信号抖动问…...
Phi-4-mini-reasoning 128K上下文应用创新:法律条文交叉引用推理案例
Phi-4-mini-reasoning 128K上下文应用创新:法律条文交叉引用推理案例 1. 模型简介与核心能力 Phi-4-mini-reasoning 是一个轻量级开源模型,专注于高质量推理任务。作为Phi-4模型家族成员,它通过合成数据训练和微调,特别擅长处理…...
