golang简易版聊天室
功能需求:
创建一个聊天室,实现群聊和单聊的功能,直接输入为群聊,@某人后输入为单聊
效果图:
群聊:
单聊:
服务端:
- package main
- import (
- "fmt"
- "net"
- "strings"
- )
- type info struct {
- conn net.Conn
- name string
- }
- var ch_all chan string = make(chan string)
- var ch_one chan string = make(chan string)
- var ch_who chan string = make(chan string)
- var infos map[string]info = make(map[string]info)
- func handle(conn net.Conn) {
- defer conn.Close()
- buf := make([]byte, )
- n, _ := conn.Read(buf)
- name := string(buf[:n])
- var oneinfo info
- oneinfo.conn = conn
- oneinfo.name = name
- addr := conn.RemoteAddr().String()
- infos[addr] = oneinfo
- msg := name + "进入聊天室"
- ch_all <- msg
- for {
- n, _ := conn.Read(buf)
- if n == {
- fmt.Printf("%s断开连接\n", addr)
- msg = name + "离开聊天室"
- delete(infos, addr)
- ch_all <- msg
- fmt.Println(msg)
- return
- }
- if string(buf[:n])[] == '@' {
- sli := strings.Fields(string(buf[:n])) //隔开
- who := sli[]
- msg = strings.Join(sli[:], "") //后边的再拼接回去
- ch_who <- who
- ch_one <- name + "->me : " + msg //单发
- continue
- }
- ch_all <- name + "->all : " + string(buf[:n]) //群发
- }
- }
- func sendone() {
- for {
- who := <-ch_who
- msg := <-ch_one
- for _, v := range infos {
- if v.name == who {
- v.conn.Write([]byte(msg))
- break
- }
- }
- }
- }
- func sendall() {
- for {
- msg := <-ch_all
- for _, val := range infos {
- val.conn.Write([]byte(msg))
- }
- }
- }
- func main() {
- listener, _ := net.Listen("tcp", ":9009")
- defer listener.Close()
- go sendall()
- go sendone()
- for {
- conn, _ := listener.Accept()
- fmt.Printf("%s建立连接\n", conn.RemoteAddr().String())
- go handle(conn)
- }
- }
客户端:
- package main
- import (
- "bufio"
- "fmt"
- "net"
- "os"
- )
- func scandata(conn net.Conn) {
- for {
- //设置可以读取带空格的myscan
- myscan := bufio.NewReader(os.Stdin)
- buf, _, _ := myscan.ReadLine()
- if string(buf) == "q" {
- os.Exit()
- }
- conn.Write(buf)
- }
- }
- func main() {
- conn, _ := net.Dial("tcp", "127.0.0.1:9009")
- buf := make([]byte, )
- args := os.Args
- conn.Write([]byte(args[]))
- go scandata(conn)
- for {
- n, _ := conn.Read(buf)
- fmt.Println(string(buf[:n]))
- }
- }
golang简易版聊天室的更多相关文章
- Swoole实现h5版聊天室笔记
声明:该聊天室目前只有一对多,一对一的聊天功能,另外,因为没有使用到mysql,所以还存在比较多的缺陷地方,但知道原理就差不多了,这里主要分享下swoole简易的聊天室制作思路. 开发环境:cento ...
- angular版聊天室|仿微信界面IM聊天|NG2+Node聊天实例
一.项目介绍 运用angular+angular-cli+angular-router+ngrx/store+rxjs+webpack+node+wcPop等技术实现开发的仿微信angular版聊天室 ...
- swoole实验版聊天室
“swoole实验版聊天室”是依据一堂swoole培训课内容改编的,结合了bootstrap前端框架.redis数据库.jquery框架等实现基本功能,只是体现了swoole的应用,并不是为了专门写个 ...
- 如何利用WebSocket实现网页版聊天室
花了将近一周的时间终于完成了利用WebSocket完成网页版聊天室这个小demo,期间还走过了一段"看似弯曲"的道路,但是我想其实也不算是弯路吧,因为你走过的路必将留下你的足迹.这 ...
- C 基于UDP实现一个简易的聊天室
引言 本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少 ...
- [XMPP]简易的聊天室实现[二](使用CocoaAsyncSocket)
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- 基于WebSocket实现网页版聊天室
WebSocket ,HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,其使用简单,应用场景也广泛,不同开发语言都用种类繁多的实现,仅Java体系中,Tomcat,Jetty,Sp ...
- Golang简易版 网站路径扫描demo
package main import ( "bufio" "fmt" "net/http" "os" "re ...
- redis实现简易在线聊天室
redis_flask简易聊天室 项目构建 这时一个基于Redis数据库的简单小项目,使用redis缓存数据,并通过flask部署到浏览器,运行截图如下: 输入名字后,就可以登陆到聊天室,主要包括三个 ...
随机推荐
- 中线,基线,垂直居中vertical-align:middle的一些理解
基线:小写字母xxxxx的下边缘线就是我们的css基线:一般的行内元素都是vertical-align: baseline;默认设置: x-height:就是指小写字母xxxx的高度,下边缘线到上边缘 ...
- HDU - 2204 Eddy's爱好 (数论+容斥)
题意:求\(1 - N(1\le N \le 1e18)\)中,能表示成\(M^k(M>0,k>1)\)的数的个数 分析:正整数p可以表示成\(p = m^k = m^{r*k'}\)的形 ...
- 今天刚接触lua 写写环境配置和基本设置
首先是安装开发工具: Quick: http://www.tairan.com/engines-download 引擎 Sublime Text的下载地址为:http://www.sublimetex ...
- 如何做好Web接口测试
说说我在测试接口时遇到的一些需要注意的点: 1.接口返回:数据格式是否与预期一致.例如:要求返回json格式的数据,json数据的key命名是否正确,对应的value是否与数据库一致.需要转换的数据是 ...
- CSS3、SVG、Canvas、WebGL动画精选整理
一.CSS3动画 名称 用途 链接 阴影波纹特效 1.元素hover效果 2.突出表现效果 http://www.jq22.com/code80 横板导航菜单动画 导航菜单 http://www.jq ...
- tomcat服务无响应堆栈分析
tomcat服务突然无响应了,导出内存堆栈和线程堆栈,分析后发现是同步锁使用不合理导致的. [root@prd-dtb-web-01 ~]# [root@prd-dtb-web-01 ~]# jmap ...
- [转]将Eclipse设置为黑色主题 方式一
将Eclipse设置为黑色主题 觉得黑色的主题&配色很高大上,于是花了点时间实践出下面一种方法. 修改代码编辑区配色 修改整个软件主题 先上成果图: 但是进度条依旧是白色的,不知道怎么弄了╮( ...
- STM32-串行SPI nor
源:FLASH 存储学习-串行SPI nor 1.1 SST25VF080B简介1.1.1 主要特性 关键点:容量.速度(时钟速度.读写速度).功耗. l 容量:8MBit: l 最高SPI时钟频率: ...
- Swoole学习(二)Swoole之TCP服务器的创建
环境:Centos6.4,PHP环境:PHP7 <?php //创建TCP服务器 /** * $host 是swoole需要监听的ip,如果要监听本地,不对外服务,那么就是127.0.0.1;如 ...
- 从页面到服务器,node实现文件下载
起因: 新来了一个需求,让用户下载一个200m的zip文件,并且校验用户信息,难点:下载的文件是200M的. 现在维护的系统,以前的文件下载,走的是node的静态文件,用的express框架上自带的静 ...