chatroom聊天室—服务端(基于golang)
博客地址
golang,tcp服务——客户端 源码下载
全局变量,用于储存聊天历史记录
var MSGS []string
main.go文件
func main() {port := "39003"Listen, err := net.Listen("tcp", ":"+port)if err != nil {fmt.Println(err)}fmt.Println("Chatroom begin,listen port:", port)connMap := make(map[net.Conn]string)for {conn, err := Listen.Accept()defer conn.Close()if err != nil {fmt.Println(err.Error())continue}connMap[conn] = conn.RemoteAddr().String()//提醒用户上线notice(conn)//处理用户操作go HandlerConn(conn, connMap)}
}
处理每一个连接conn操作
func HandlerConn(conn net.Conn, connMap map[net.Conn]string) {buf := make([]byte, 1024)for {n, err := conn.Read(buf)if err != nil {// fmt.Println("conn数据读取失败" + err.Error())return}msg := strings.Trim(string(buf[:n]), "\r\n")fmt.Printf("msg: %v\n", msg)if strings.Contains(msg, "firstname") {name := strings.ReplaceAll(msg, "firstname", "")fisrtrename(conn, connMap, name)broadcastUserOnline(conn, connMap, name+"用户上线")fmt.Println(name + "用户上线")continue}handlerMsg(conn, connMap, msg)}
}
处理连接操作后,处理消息
消息操作,分为broadcast广播消息以及系统操作
当前支持操作,修改用户名,查看在线用户,查看历史聊天记录
func handlerMsg(conn net.Conn, connMap map[net.Conn]string, msg string) {parseArr := strings.Split(msg, "$")//判断消息是否为操作if len(parseArr) > 1 && parseArr[0] == "do" {//是——执行操作switch parseArr[1] {case "rename":{if len(parseArr) == 3 {name := parseArr[2]rename(conn, connMap, name)} else {returnerr(conn)}}case "list":{if len(parseArr) == 2 {list(conn, connMap)}}case "hy":{if len(parseArr) == 2 {getHistory(conn)}}default:{returnerr(conn)}}} else {//否——广播信息broadcast(conn, connMap, msg)}}
操作函数——获取聊天记录
func getHistory(conn net.Conn) {allmsg := ""for num, msg := range MSGS {str := fmt.Sprintf("\n *******第%d条*******", num+1)msg = str + msgallmsg += msg}conn.Write([]byte(allmsg))
}
func save10Msg(msg string) {MSGS = append(MSGS, msg)// MSGS = MSGS[10:]
}
操作函数——获取在线列表
func list(conn net.Conn, connMap map[net.Conn]string) {var listname string = ""for connCur, name := range connMap {_, err := connCur.Write([]byte("false"))if err != nil {delete(connMap, connCur)continue} else {fmt.Printf("name: %v\n", name)}listname = listname + name + "\n"}conn.Write([]byte(listname))}
操作函数——修改用户名
func rename(conn net.Conn, connMap map[net.Conn]string, name string) {for connCur := range connMap {if connCur == conn {connMap[conn] = namerecmsg := "操作成功,修改name为:" + name + "\n"conn.Write([]byte(recmsg))}}
}
广播消息操作
func broadcast(conn net.Conn, connMap map[net.Conn]string, msg string) {for connCur := range connMap {if conn == connCur {up := "\n==========历史信息============\n"msg := "time:" + time.Now().Format(" 15:04:05 ") + "\n" + "name:" + connMap[conn] + "\n" + "msg:" + msg + "\n"down := "===========历史信息===========\n\n"save10Msg(up + msg + down)continue}up := "\n==========历史信息============\n"msg := "time:" + time.Now().Format(" 15:04:05 ") + "\n" + "name:" + connMap[conn] + "\n" + "msg:" + msg + "\n"down := "===========历史信息===========\n\n"save10Msg(up + msg + down)str := []byte(msg)_, err := connCur.Write(str)if err != nil {// fmt.Println("broadcast fail", err.Error())delete(connMap, connCur)continue}}}
其他函数①——提醒用户上线
func broadcastUserOnline(conn net.Conn, connMap map[net.Conn]string, msg string) {for connCur := range connMap {if conn == connCur {continue}fmt.Println("回写内容")str := []byte("time:" + time.Now().Format(" 15:04:05 ") + "\n" + "msg:" + msg + "\n")_, err := connCur.Write(str)if err != nil {// fmt.Println("broadcast fail", err.Error())delete(connMap, connCur)continue}}
}
其他函数②——处理用户名的初始化
func fisrtrename(conn net.Conn, connMap map[net.Conn]string, name string) {for connCur := range connMap {if connCur == conn {connMap[conn] = name}}
}
其他函数③——返回错误信息
func returnerr(conn net.Conn) {errmsg := "参数错误,请重新输入\n"conn.Write([]byte(errmsg))
}
chatroom聊天室—服务端(基于golang)相关推荐
- 安卓多人聊天室服务端
安卓多人聊天室服务端 服务端没有图形界面,直接上代码 package cn.ttw.netProgram.tcp;import java.io.*; import java.net.InetAddre ...
- 聊天室服务端和客户端的实现
在Linux环境下,实现客户端和服务端之间的信息发送和接收,实现聊天室,可进行文件传送功能. 客户端: #include <sys/types.h> #include <sys/so ...
- python与html5搭建聊天室_html5 websocket 新版协议聊天室 服务端(python版)
网上找了很多代码都是旧版协议的,研究了很久终于弄清楚了 现在发个用新版协议写的服务端代码出来(这个代码是从网上旧版协议改过来的) 最要就是握手协议和发送接受字符的方式变了 # incoding=utf ...
- 【第99题】JAVA高级技术-网络编程18(简易聊天室13:聊天室服务端)
回城传送–><JAVA筑基100例> 文章目录 零.前言 一.题目描述 二.解题思路 三.代码详解 多学一个知识点 四.推荐专栏 五.示例源码下载 零.前言 今天是学习 JAVA ...
- 完整的ChatRoom聊天室代码
完整的ChatRoom聊天室代码 原创Viki渡清欢 发布于2019-04-16 22:37:52 阅读数 537 收藏 展开 概述 上节说到消息粘包和数据不完整的问题未解决,也就是数据传输缓冲区固 ...
- NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示
2019独角兽企业重金招聘Python工程师标准>>> 前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目 ...
- 魔坊APP项目-16-种植园、websocket协议、服务端基于socket提供服务(基于房间管理分发信息)、种植园页面展示
种植园 我们需要完成的种植园,是一个互动频繁,并且要求有一定即时性的模块,所以如果继续基于http协议开发,那么需要通过ajax发送大量http请求,同时因为http本身属于单向通讯,所以服务端无法主 ...
- java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述.doc...
基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述 本科生毕业论文(设计) 题 目: 基于Java网页版聊天室的设计与实现 姓 名:学 院: 理学院 专 业: 信息与计算科学 班 级: 信 ...
- java web聊天室论文_基于javaweb聊天室.doc
基于javaweb聊天室.doc 南嗦岌凌*4 文(设计) 本科生毕业论 题 目:基于Java网页版聊天室的设计与实现 姓名:陈义旺 学院:理学院 专业:信息与计算科学 班级:信科092 学号: 指导 ...
最新文章
- pygame做的著名游戏_用python写游戏之2D跑酷游戏(一)
- ajax提交到mysql_利用ajax的方式来提交数据到后台数据库及交互功能
- Chrome 中的 JavaScript 断点设置和调试技巧
- Kaggle知识点:时序数据与Embedding
- 追踪社保基金操盘者的足迹-补充
- LeetCode 838. 推多米诺(模拟)
- Merge k Sorted Lists leetcode java
- linux telnet命令不可用的解决办法
- vue.3.0 dom赋值_Vue3.0的几大新特性
- fastdfs返回的url_FastDFS上传文件Demospringboot实现
- 通达信最新 行情服务器,通达信行情服务器数据
- Java 高级 多线程 线程安全 3 种常见解决方案教程.
- 2020-04-27
- 30年历史回顾,Jeff Dean:我们整理了一份「稀疏专家模型」研究综述
- 将 VSTO 与 SharePoint 内容类型相集成
- 给程序进行简单的加壳
- 解决谷歌浏览器启动页面默认是搜狗浏览?
- Android 手机录制wav格式音频文件实现
- Win10使用FTP实现手机访问电脑FTP服务
- 【BZOJ2754】[SCOI2012]喵星球上的点名
热门文章
- 什么软件测试144hz显示器,1500R曲面的144Hz电竞显示器 飞利浦242M7评测
- 关于Win7系统不能删除avast!
- 目标检测——day45 Deep Affinity Network for Multiple Object Tracking
- 通过精准且价格合理的智能手机眼动追踪加快眼动研究
- 汽机车仪表/温控器/电量显示器/无线蓝牙音箱/电力监测仪等LCD段码液晶显示屏驱动IC-VK1623 LQFP/QFP100/DICE裸片,48*8段显示,兼容替代市面上的1623,且具省电模式
- PDF的两种密码忘记了,怎么解决
- pythonxy官网下载_GitHub - wptyut/codeparkshare: Python初学者(零基础学习Python、Python入门)书籍、视频、资料、社区推荐...
- Ubuntu的:有未能满足的依赖关系
- 液压伺服比例控制及PLC应用—学习笔记1
- nginx+php https 实践