博客地址

golang,tcp服务——客户端 源码下载

功能支持
|1.修改用户名————dorenamerenamerename"修改的用户名"
| 例如:修改用户名为java,dorenamerenamerenamejava
|
|2.查看所有在线用户————do$list
|3.查看历史消息,最多支持查看10条
|4.用户上线提醒

全局变量,用于储存聊天历史记录

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)相关推荐

  1. 安卓多人聊天室服务端

    安卓多人聊天室服务端 服务端没有图形界面,直接上代码 package cn.ttw.netProgram.tcp;import java.io.*; import java.net.InetAddre ...

  2. 聊天室服务端和客户端的实现

    在Linux环境下,实现客户端和服务端之间的信息发送和接收,实现聊天室,可进行文件传送功能. 客户端: #include <sys/types.h> #include <sys/so ...

  3. python与html5搭建聊天室_html5 websocket 新版协议聊天室 服务端(python版)

    网上找了很多代码都是旧版协议的,研究了很久终于弄清楚了 现在发个用新版协议写的服务端代码出来(这个代码是从网上旧版协议改过来的) 最要就是握手协议和发送接受字符的方式变了 # incoding=utf ...

  4. 【第99题】JAVA高级技术-网络编程18(简易聊天室13:聊天室服务端)

    回城传送–><JAVA筑基100例> 文章目录 零.前言 一.题目描述 二.解题思路 三.代码详解 多学一个知识点 四.推荐专栏 五.示例源码下载 零.前言 ​ 今天是学习 JAVA ...

  5. 完整的ChatRoom聊天室代码

    完整的ChatRoom聊天室代码 原创Viki渡清欢 发布于2019-04-16 22:37:52 阅读数 537  收藏 展开 概述 上节说到消息粘包和数据不完整的问题未解决,也就是数据传输缓冲区固 ...

  6. NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

    2019独角兽企业重金招聘Python工程师标准>>> 前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目 ...

  7. 魔坊APP项目-16-种植园、websocket协议、服务端基于socket提供服务(基于房间管理分发信息)、种植园页面展示

    种植园 我们需要完成的种植园,是一个互动频繁,并且要求有一定即时性的模块,所以如果继续基于http协议开发,那么需要通过ajax发送大量http请求,同时因为http本身属于单向通讯,所以服务端无法主 ...

  8. java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述.doc...

    基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述 本科生毕业论文(设计) 题 目: 基于Java网页版聊天室的设计与实现 姓 名:学 院: 理学院 专 业: 信息与计算科学 班 级: 信 ...

  9. java web聊天室论文_基于javaweb聊天室.doc

    基于javaweb聊天室.doc 南嗦岌凌*4 文(设计) 本科生毕业论 题 目:基于Java网页版聊天室的设计与实现 姓名:陈义旺 学院:理学院 专业:信息与计算科学 班级:信科092 学号: 指导 ...

最新文章

  1. pygame做的著名游戏_用python写游戏之2D跑酷游戏(一)
  2. ajax提交到mysql_利用ajax的方式来提交数据到后台数据库及交互功能
  3. Chrome 中的 JavaScript 断点设置和调试技巧
  4. Kaggle知识点:时序数据与Embedding
  5. 追踪社保基金操盘者的足迹-补充
  6. LeetCode 838. 推多米诺(模拟)
  7. Merge k Sorted Lists leetcode java
  8. linux telnet命令不可用的解决办法
  9. vue.3.0 dom赋值_Vue3.0的几大新特性
  10. fastdfs返回的url_FastDFS上传文件Demospringboot实现
  11. 通达信最新 行情服务器,通达信行情服务器数据
  12. Java 高级 多线程 线程安全 3 种常见解决方案教程.
  13. 2020-04-27
  14. 30年历史回顾,Jeff Dean:我们整理了一份「稀疏专家模型」研究综述
  15. 将 VSTO 与 SharePoint 内容类型相集成
  16. 给程序进行简单的加壳
  17. 解决谷歌浏览器启动页面默认是搜狗浏览?
  18. Android 手机录制wav格式音频文件实现
  19. Win10使用FTP实现手机访问电脑FTP服务
  20. 【BZOJ2754】[SCOI2012]喵星球上的点名

热门文章

  1. 什么软件测试144hz显示器,1500R曲面的144Hz电竞显示器 飞利浦242M7评测
  2. 关于Win7系统不能删除avast!
  3. 目标检测——day45 Deep Affinity Network for Multiple Object Tracking
  4. 通过精准且价格合理的智能手机眼动追踪加快眼动研究
  5. 汽机车仪表/温控器/电量显示器/无线蓝牙音箱/电力监测仪等LCD段码液晶显示屏驱动IC-VK1623 LQFP/QFP100/DICE裸片,48*8段显示,兼容替代市面上的1623,且具省电模式
  6. PDF的两种密码忘记了,怎么解决
  7. pythonxy官网下载_GitHub - wptyut/codeparkshare: Python初学者(零基础学习Python、Python入门)书籍、视频、资料、社区推荐...
  8. Ubuntu的:有未能满足的依赖关系
  9. 液压伺服比例控制及PLC应用—学习笔记1
  10. nginx+php https 实践