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部署到浏览器,运行截图如下: 输入名字后,就可以登陆到聊天室,主要包括三个 ...
随机推荐
- BitmapFactory.decodeStream(inputStream)返回null的解决方法
场景:Android,通过inputStream从网络上获取图片 随后两次使用BitmapFactory对InputStream进行操作,一次获取宽高,另一次缩放 但是在缩放时,发现inputStre ...
- 简单介绍--TOSCA自动化测试工具
1.工具源自 TOSCA由公司Tricentis研发.这是一家来自奥地利的软件初创企业,专门帮助企业开发团队进行自动化软件测试.(百科) TOSCA的思想是,不用会编程的测试人员可以直接上手自动化. ...
- Ubuntu 14.04.5 imx6 开发环境搭建
1,下载VMware Workstation虚拟机 地址:http://1.xp510.com:801/xp2011/VMware10.7z 2,下载Ubuntu 14.04.5 LTS 32位Ubu ...
- PHP开发之环境配置
nignx //start nginx -s reload //restart composer create-project laravel/laravel learnlaravel5 //自动创建 ...
- Linux 模拟网络丢包,延时
实战: 丢包tc qdisc add dev bond0 root netem loss 10% 延迟tc qdisc add dev bond0 root netem latency 100ms 丢 ...
- MySql中concat函数的用法(链接字符串)
MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...
- Http:设置 浏览器中MIME 类型
http://www.163ns.com/zixun/post/4602.html 自定义MIME类型支持FLV的相关设置 网络空间支持FLV的相关设置其实很简单,就是自定义一个MIME类型 一般虚拟 ...
- Java硬件同步机制Swap指令模拟+记录型信号量模拟
学校实验存档//.. 以经典的生产者消费者问题作为背景. 进程同步方式接口: package method; /** * P表示通过,V表示释放 */ public interface Method ...
- Jquery编历数组
<html> <head> <title>编历</title> <script type="text/javascript"& ...
- @Override笔记
作用:用来保证正确重写方法,当你重写方法出错时,比如方法名误写,或者漏掉参数,编译器会提示编译错误. 使用场景:继承父类,重写父类方法:实现接口,实现接口方法. 备注:jdk1.5之允许在继承时使用, ...