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部署到浏览器,运行截图如下: 输入名字后,就可以登陆到聊天室,主要包括三个 ...
随机推荐
- spark streaming基础知识1
1.怎么理解spark streaming中的dstream? 它是spark streaming的基础数据结构,代表着(time,RDD)序列,有两种生成方式,一种是基于流数据创建(kafka,so ...
- 50条常用liunx命令整理
1.pwd命令 :确定自己在那个目录 使用方法:在liunx命令输入框里面输入pwd,自动就会显示出自己现在在那个目录下 操作截图: 此时正处在root目录里面 2.cd命令:切换目录的意思 使用方法 ...
- NetBeans 启动时出现 Invalid jdkhome specified提示
执行 NetBeans 出现如下文字内容: Invalid jdkhome specifiedCannot locate java installation in specifired jdkhome ...
- Linux查找含有某字符串的文本文件
转自:http://www.cnblogs.com/wangkongming/p/4476933.html 如果你想在当前目录下 查找"hello,world!"字符串,可以这样 ...
- Minor GC和Full GC区别(转)
http://blog.csdn.net/u010796790/article/details/52213708 概念: 新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Ja ...
- 前端学习之NaN浅析
在学习Java集合的时候遇到了Float.isNaN(float)函数,点进去一看就不理解了,函数实现如下: public static boolean isNaN(float v) { return ...
- JS对象深入剖析
对象概述 Objects are mutable keyed collections. An object is a container of properties, where a propert ...
- Yahoo网站性能优化的34条规则
摘自:http://blog.chinaunix.net/uid/20714478/cid-74195-list-1.html Yahoo网站性能优化的34条规则 1.尽量减少HTTP请求次数 终端用 ...
- Ubuntu 12.04下安装QQ 2012 Beta3
Ubuntu 12.04下安装QQ 2012 Beta3 由于wine的发展非常迅速.现在网上的利用老版本的wine来安装QQ2012的教程已经有些过时了.实际上操作起来非常简单: 第一步:Ctr ...
- 记数排序 & 桶排序 & 基数排序
为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...