Go语言聊天室demo

Go语言聊天室demo

  • 话不多说直接上代码

话不多说直接上代码

Tcp服务端

package mainimport ("container/list""encoding/json""fmt"uuid "github.com/satori/go.uuid""net""strings"
)type GlobalConnInfo struct {ClientConnMap map[string]net.ConnClientList    list.List
}type RespModel struct {Code intMsg  stringData any
}func main() {//这里维护了客户客户端的连接信息globalConnInfo := GlobalConnInfo{ClientConnMap: make(map[string]net.Conn), ClientList: list.List{}}//监听端口listener, _ := net.Listen("tcp", ":9876")fmt.Println("TCP服务器启动监听")for {//Listen返回成功后,这个服务会进入一个循环,调用net.Listener 的 Accept 方法接收新客户端连接//在没有新连接的时候,这个服务会阻塞在 Accept 调用上,直到有客户端连接上来,Accept 方法将返回一个 net.Conn 实例,用于和新连上的客户端进行通信。conn, _ := listener.Accept()fmt.Println("【新的连接上来了, 启动新的协程处理】", conn)//启动go协程, 处理conn的逻辑go doSyncHandler(conn, globalConnInfo)}
}func doSyncHandler(conn net.Conn, globalConnInfo GlobalConnInfo) {//重命名函数name := serverFirstRename(conn)//将name作为key维护连接globalConnInfo.ClientConnMap[name] = connglobalConnInfo.ClientList.PushBack(name)//核心交互逻辑for {//定义读取数据读缓存数组var readBytes []byte = make([]byte, 1024)size, _ := conn.Read(readBytes)//客户端给服务器发了数据服务端才返回if size >= 0 {action := strings.TrimSpace(string(readBytes))[:size]fmt.Println("【server】[client ---> server] : ", action)if action == "1" {resultBytes, _ := json.Marshal(RespModel{Code: 200, Msg: "当前系统在线用户", Data: globalConnInfo})conn.Write(resultBytes)} else if action == "2" {resultBytes, _ := json.Marshal(RespModel{Code: 200, Msg: "新用户昵称", Data: uuid.NewV1().String()[:32]})conn.Write(resultBytes)} else if action == "3" {resultBytes, _ := json.Marshal(RespModel{Code: 200, Msg: "退出成功", Data: nil})conn.Write(resultBytes)} else {resultBytes, _ := json.Marshal(RespModel{Code: 200, Msg: "暂未开发的操作, 请重新选择操作", Data: nil})conn.Write(resultBytes)}}}}func serverFirstRename(conn net.Conn) string {//服务端随机命名var name string = uuid.NewV1().String()[:32]//返回服务端命名结果firstWriteBytes := []byte(name)conn.Write(firstWriteBytes)fmt.Println("【server】[server ---> client] 服务端命名结果: ", string(firstWriteBytes))return name
}

Tcp客户端

package mainimport ("bufio""fmt""net""os""strings"
)type RespModel struct {Code intMsg  stringData any
}func main() {scanner := bufio.NewScanner(os.Stdin)//Dial 函数向服务端发起 TCP 连接,这个函数会一直阻塞,直到连接成功或失败后,才会返回。conn, _ := net.Dial("tcp", "localhost:9876")fmt.Println("【客户端监听服务】")//客户端命名clientFirstRename(conn)for {//控制台读取fmt.Println("您可以选择操作: 1.聊天, 2.系统重命名, 3.退出聊天室", actionMap)scanner.Scan()//定义写入缓存数组writeBytes := []byte(strings.TrimSpace(scanner.Text()))conn.Write(writeBytes)fmt.Println("【client】[client ---> server] : ", string(writeBytes))//定义读取数据读缓存数组var readBytes []byte = make([]byte, 1024)conn.Read(readBytes)fmt.Println("【client】[server ---> client] : ", string(readBytes))}}func clientFirstRename(conn net.Conn) {//定义读取数据读缓存数组var readBytes []byte = make([]byte, 1024)conn.Read(readBytes)fmt.Println("【client】[server ---> client] 来自服务端的名称:", string(readBytes))
}

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

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

相关文章

13年测试老鸟,接口性能测试-压测总结汇总,一文概全...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、概述 性能测试…

如何禁止员工在上班时间利用电脑打游戏逛娱乐网站?

在现代化的工作环境中,电脑已成为员工日常工作的必需品。然而,一些员工可能在上班时间利用电脑进行非工作相关的活动,如打游戏或浏览娱乐网站。这不仅影响个人的工作效率,也可能对团队的整体绩效和公司的文化产生负面影响。因此&a…

python界面开发 - Radiobutton:单选按钮

文章目录 1. python图形界面开发1.1. Python图形界面开发——Tkinter1.2. Python图形界面开发——PyQt1.3. Python图形界面开发——wxPython1.4. Python图形界面开发—— PyGTK:基于GTK1.5. Python图形界面开发—— Kivy1.6. Python图形界面开发——可视化工具1.7. …

前端工程部署步骤小记

安装mqtt: “mqtt”: “^4.3.7”, npm install git panjiacheng 后台demo下载zip 1、npm install --registryhttps://registry.npmmirror.com 2、npm run dev 前端demo创建 1、安装npm 2、npm install vuenext 3、npm install -g vue/cli 查看版本 vue --version 4、更新插件…

【Linux C | 网络编程】多播的概念、多播地址、UDP实现多播的C语言例子

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

如何选择适合您需求的虚拟主机服务

随着互联网的发展,虚拟主机服务在网站托管领域扮演着至关重要的角色。我们在前几天遇到客户咨询如何在Hostease服务商选择适合的主机服务。本文将介绍如何选择适合您需求的虚拟主机服务,以确保您的网站或应用程序能够稳定运行并获得最佳性能。 确定您的需…

vscode的c++开发环境配置

主要是安装一些插件,c/c开发常用的插件有如下几个: 插件名称功能C/CC 和 C的编译环境C/C SnippetsC/C重用代码块C/C Advanced LintC/C静态检测Code Runner代码运行Include AutoComplete自动头文件包含Rainbow Brackets彩虹花括号,有助于阅读…

常见的验证码

一、短信验证码 前端: 用户填写手机号,点击按钮发送请求用户短信得到验证码后,用户填写表单提交 form 表单,进行验证 后台: 随机生成几位验证码并将生成时间、手机号、验证码存储起来,可以存到session、…

小游戏加固方案已全面适配微信、QQ、抖音、快手、美团、华为、支付宝渠道

2023年,国内移动游戏收入与游戏用户规模双双创下历史新高。其中小游戏异军突起,市场规模达到200亿元,同比增长300%,成了万众瞩目的行业新风口。 小游戏的高速发展带来了更多的活力,产出了多款月流水过亿的热门游戏。行…

Linux下Qt程序打包发布

如何打包 注意事项 可能遇到的问题 如何打包: 1、先下载linuxdeployqt工具,下载链接:https://github.com/probonopd/linuxdeployqt/releases 选择最后release的版本,然后执行命令: sudo chmod 777 linuxdepl…

webpack编译报错Cannot find module ‘@babel/core‘且无法识别es6的reset语法

~ npm install babel-core babel-loader --save-dev 用了这个指令后webpack报错 尝试重新下载了babel-core babel-loader 还是不行 Cannot find module babel/core babel-loader8 requires Babel 7.x (the package babel/core). If youd like to use Babel 6.x (babel-core), …

Gson(List<Object>转String 、String转List<Object>)

要在Java项目中使用Gson库&#xff0c;你需要添加相应的依赖项。以下是在Maven项目的pom.xml文件中添加Gson依赖的示例&#xff1a; <dependencies><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId>&l…

Matter 笔记1-环境准备,编译

不要远程登录Ubuntu输入以下命令&#xff0c;原因&#xff1a;ubuntu/linux上的http代理设置 1. 准备 1.1 工具 Ubuntu 22.04 LTSClash 里General的端口设置到ubuntu 的网络设置里 1.2 代码 这里使用芯科整理过的代码 git clone https://github.com/SiliconLabs/matter.…

3. springboot中集成部署vue3

1. vue3构建 构建命令 npm run build&#xff0c; 构建的结果在disc目录&#xff1a; 2. springboot集成 2.1 拷贝vue3构建结果到springboot resources/static目录 2.2 springboot pom依赖 添加thymeleaf依赖 <dependency><groupId>org.springframework.boot</…

Rust错误处理和Result枚举类异常错误传递

Rust 有一套独特的处理异常情况的机制&#xff0c;它并不像其它语言中的 try 机制那样简单。 首先&#xff0c;程序中一般会出现两种错误&#xff1a;可恢复错误和不可恢复错误。 可恢复错误的典型案例是文件访问错误&#xff0c;如果访问一个文件失败&#xff0c;有可能是因…

机器学习模型—线性回归

文章目录 机器学习模型—线性回归线性回归模型的假设线性回归简单线性回归多元线性回归多元线性回归实现多项式回归多项式回归的实现线性回归二阶函数回归三阶函数回归总结机器学习模型—线性回归 线性回归是一种统计方法,用于对因变量与给定的一组自变量之间的关系进行建模。…

乔琼:高性能会议传声器的产品优化设计| 演讲嘉宾公布

一、智能家居与会议系统 智能家居与会议系统分论坛将于3月28日同期举办&#xff01; 智能会议系统它通过先进的技术手段&#xff0c;提高了会议效率&#xff0c;降低了沟通成本&#xff0c;提升了参会者的会议体验。对于现代企业、政府机构和学术界是不可或缺的。在这里&#x…

arm系统构建的基础知识

目录 一、环境变量 二、归档和压缩 (一) 常用命令 (二) 常用参数 三、磁盘分区和挂载 四、网络管理 一、环境变量 显示环境变量 —— echo设置临时环境变量 —— exportecho $PATH —— 显示当前PATH环境变量 在当前目录下&#xff0c;编写一个hello.c 编译并运行。 图…

有哪些搭建代理服务器的好方法?--代理IP小课堂

在互联网技术日益成熟的今天&#xff0c;代理服务器在提升网络安全性、提高访问速度以及数据抓取等方面发挥着越来越重要的作用。无论是大型企业还是个人用户&#xff0c;都可能会考虑搭建自己的代理服务器来满足特定的网络需求。今天我们就来说一说&#xff0c;要如何搭建代理…

千帆AppBuilder使用指南-组件中心

应用中心 百度智能云千帆AppBuilder&#xff08;以下简称为AppBuilder&#xff09;应用中心&#xff0c;提供了大量可以立即体验的应用示例&#xff0c;开发者可以在这里搜索感兴趣的应用进行使用。 官方应用&#xff1a;AppBuilder官方提供的应用&#xff0c;可以立即体验应用…