功能需求:

创建一个聊天室,实现群聊和单聊的功能,直接输入为群聊,@某人后输入为单聊

效果图:

群聊:

 

单聊:

服务端:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "net"
  6. "strings"
  7. )
  8.  
  9. type info struct {
  10. conn net.Conn
  11. name string
  12. }
  13.  
  14. var ch_all chan string = make(chan string)
  15. var ch_one chan string = make(chan string)
  16. var ch_who chan string = make(chan string)
  17. var infos map[string]info = make(map[string]info)
  18.  
  19. func handle(conn net.Conn) {
  20. defer conn.Close()
  21.  
  22. buf := make([]byte, )
  23. n, _ := conn.Read(buf)
  24. name := string(buf[:n])
  25. var oneinfo info
  26. oneinfo.conn = conn
  27. oneinfo.name = name
  28. addr := conn.RemoteAddr().String()
  29. infos[addr] = oneinfo
  30. msg := name + "进入聊天室"
  31. ch_all <- msg
  32.  
  33. for {
  34. n, _ := conn.Read(buf)
  35. if n == {
  36. fmt.Printf("%s断开连接\n", addr)
  37. msg = name + "离开聊天室"
  38. delete(infos, addr)
  39. ch_all <- msg
  40. fmt.Println(msg)
  41. return
  42. }
  43. if string(buf[:n])[] == '@' {
  44. sli := strings.Fields(string(buf[:n])) //隔开
  45. who := sli[]
  46. msg = strings.Join(sli[:], "") //后边的再拼接回去
  47. ch_who <- who
  48. ch_one <- name + "->me : " + msg //单发
  49. continue
  50. }
  51. ch_all <- name + "->all : " + string(buf[:n]) //群发
  52. }
  53. }
  54.  
  55. func sendone() {
  56. for {
  57. who := <-ch_who
  58. msg := <-ch_one
  59. for _, v := range infos {
  60. if v.name == who {
  61. v.conn.Write([]byte(msg))
  62. break
  63. }
  64. }
  65. }
  66. }
  67. func sendall() {
  68. for {
  69. msg := <-ch_all
  70. for _, val := range infos {
  71. val.conn.Write([]byte(msg))
  72. }
  73. }
  74. }
  75. func main() {
  76. listener, _ := net.Listen("tcp", ":9009")
  77. defer listener.Close()
  78. go sendall()
  79. go sendone()
  80. for {
  81. conn, _ := listener.Accept()
  82. fmt.Printf("%s建立连接\n", conn.RemoteAddr().String())
  83. go handle(conn)
  84. }
  85. }

客户端:

  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "net"
  7. "os"
  8. )
  9.  
  10. func scandata(conn net.Conn) {
  11. for {
  12. //设置可以读取带空格的myscan
  13. myscan := bufio.NewReader(os.Stdin)
  14. buf, _, _ := myscan.ReadLine()
  15. if string(buf) == "q" {
  16. os.Exit()
  17. }
  18. conn.Write(buf)
  19. }
  20. }
  21. func main() {
  22. conn, _ := net.Dial("tcp", "127.0.0.1:9009")
  23. buf := make([]byte, )
  24. args := os.Args
  25. conn.Write([]byte(args[]))
  26. go scandata(conn)
  27. for {
  28. n, _ := conn.Read(buf)
  29. fmt.Println(string(buf[:n]))
  30. }
  31. }

golang简易版聊天室的更多相关文章

  1. Swoole实现h5版聊天室笔记

    声明:该聊天室目前只有一对多,一对一的聊天功能,另外,因为没有使用到mysql,所以还存在比较多的缺陷地方,但知道原理就差不多了,这里主要分享下swoole简易的聊天室制作思路. 开发环境:cento ...

  2. angular版聊天室|仿微信界面IM聊天|NG2+Node聊天实例

    一.项目介绍 运用angular+angular-cli+angular-router+ngrx/store+rxjs+webpack+node+wcPop等技术实现开发的仿微信angular版聊天室 ...

  3. swoole实验版聊天室

    “swoole实验版聊天室”是依据一堂swoole培训课内容改编的,结合了bootstrap前端框架.redis数据库.jquery框架等实现基本功能,只是体现了swoole的应用,并不是为了专门写个 ...

  4. 如何利用WebSocket实现网页版聊天室

    花了将近一周的时间终于完成了利用WebSocket完成网页版聊天室这个小demo,期间还走过了一段"看似弯曲"的道路,但是我想其实也不算是弯路吧,因为你走过的路必将留下你的足迹.这 ...

  5. C 基于UDP实现一个简易的聊天室

    引言 本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少 ...

  6. [XMPP]简易的聊天室实现[二](使用CocoaAsyncSocket)

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  7. 基于WebSocket实现网页版聊天室

    WebSocket ,HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,其使用简单,应用场景也广泛,不同开发语言都用种类繁多的实现,仅Java体系中,Tomcat,Jetty,Sp ...

  8. Golang简易版 网站路径扫描demo

    package main import ( "bufio" "fmt" "net/http" "os" "re ...

  9. redis实现简易在线聊天室

    redis_flask简易聊天室 项目构建 这时一个基于Redis数据库的简单小项目,使用redis缓存数据,并通过flask部署到浏览器,运行截图如下: 输入名字后,就可以登陆到聊天室,主要包括三个 ...

随机推荐

  1. 中线,基线,垂直居中vertical-align:middle的一些理解

    基线:小写字母xxxxx的下边缘线就是我们的css基线:一般的行内元素都是vertical-align: baseline;默认设置: x-height:就是指小写字母xxxx的高度,下边缘线到上边缘 ...

  2. HDU - 2204 Eddy's爱好 (数论+容斥)

    题意:求\(1 - N(1\le N \le 1e18)\)中,能表示成\(M^k(M>0,k>1)\)的数的个数 分析:正整数p可以表示成\(p = m^k = m^{r*k'}\)的形 ...

  3. 今天刚接触lua 写写环境配置和基本设置

    首先是安装开发工具: Quick: http://www.tairan.com/engines-download 引擎 Sublime Text的下载地址为:http://www.sublimetex ...

  4. 如何做好Web接口测试

    说说我在测试接口时遇到的一些需要注意的点: 1.接口返回:数据格式是否与预期一致.例如:要求返回json格式的数据,json数据的key命名是否正确,对应的value是否与数据库一致.需要转换的数据是 ...

  5. CSS3、SVG、Canvas、WebGL动画精选整理

    一.CSS3动画 名称 用途 链接 阴影波纹特效 1.元素hover效果 2.突出表现效果 http://www.jq22.com/code80 横板导航菜单动画 导航菜单 http://www.jq ...

  6. tomcat服务无响应堆栈分析

    tomcat服务突然无响应了,导出内存堆栈和线程堆栈,分析后发现是同步锁使用不合理导致的. [root@prd-dtb-web-01 ~]# [root@prd-dtb-web-01 ~]# jmap ...

  7. [转]将Eclipse设置为黑色主题 方式一

    将Eclipse设置为黑色主题 觉得黑色的主题&配色很高大上,于是花了点时间实践出下面一种方法. 修改代码编辑区配色 修改整个软件主题 先上成果图: 但是进度条依旧是白色的,不知道怎么弄了╮( ...

  8. STM32-串行SPI nor

    源:FLASH 存储学习-串行SPI nor 1.1 SST25VF080B简介1.1.1 主要特性 关键点:容量.速度(时钟速度.读写速度).功耗. l 容量:8MBit: l 最高SPI时钟频率: ...

  9. Swoole学习(二)Swoole之TCP服务器的创建

    环境:Centos6.4,PHP环境:PHP7 <?php //创建TCP服务器 /** * $host 是swoole需要监听的ip,如果要监听本地,不对外服务,那么就是127.0.0.1;如 ...

  10. 从页面到服务器,node实现文件下载

    起因: 新来了一个需求,让用户下载一个200m的zip文件,并且校验用户信息,难点:下载的文件是200M的. 现在维护的系统,以前的文件下载,走的是node的静态文件,用的express框架上自带的静 ...