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部署到浏览器,运行截图如下: 输入名字后,就可以登陆到聊天室,主要包括三个 ...
随机推荐
- 300. Longest Increasing Subsequence(LIS最长递增子序列 动态规划)
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...
- 如何获取iClap的内测资格
iClap,一款拥有智能产品管理能力的系统,第一次遇见是在8月下旬的创新中国的展会上,茫茫人海中只因多看了你一眼,便深深的留在脑海里挥之不去,展会结束的当天就忍不住想要更多的了解你,登陆iClap官网 ...
- spark学习(基础篇)--(第三节)Spark几种运行模式
spark应用执行机制分析 前段时间一直在编写指标代码,一直采用的是--deploy-mode client方式开发测试,因此执行没遇到什么问题,但是放到生产上采用--master yarn-clus ...
- quic协议实践
QUIC实践 环境Ubuntu14.x86_64 gcc4.8 python2.7 编译QUIC服务器和客户端 下载 git clone https://github.com/google/proto ...
- 在Linux下不重启让配置文件修改后立即生效的办法
在linux修改配置文件后可能没有生效,比如JDK文件配置,配置后可能没有生效,为了让文件生效,如下操作可以让配置文件生效. 例如,我刚修改了“/etc/profile”或“~/.bash_profi ...
- ANE报错fix:Could not generate timestamp: Connection reset.
如果你打包ANE时候 报了:Could not generate timestamp: Connection reset. 那么很有可能你用了JDK 1.8. 解决方案一 退回到 JDK 1.7,重新 ...
- Python面试题目之(针对dict或者set数据类型)边遍历 边修改 报错dictionary changed size during iteration
# result 是一个字典, 把里面属性值是None的属性删除 for key in result: if not result[key]: del result[key] continue 但是报 ...
- delegate委托
https://www.cnblogs.com/leicao/p/5251090.html 委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创 ...
- linux下安装sphinx
1.下载sphinx源码包 上面截图的这个网址 复制链接地址 在putty终端使用:wget http://sphinxsearch.com/files/sphinx-2.3.1-beta.t ...
- 如何确保C#的应用程序只被打开一次
http://stackoverflow.com/questions/184084/how-to-force-c-sharp-net-app-to-run-only-one-instance-in-w ...