功能需求:

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

效果图:

群聊:

 

单聊:

服务端:

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简易版聊天室的更多相关文章

  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. mongodb中的_id的ObjectId的生成规则

    MongoDB中存储的文档必须有一个"_id" .这个键值可以是任何类型,默认是ObjectID对象.在一个集合里,每个文档都有一个唯一的“_id”,确保集合里的每个文档都能被唯一 ...

  2. [日志]logback告警

    开发过程中,难免会有发生错误或异常的时候,有些是需要及时通知到相关开发人员的.logback可以通过简单的配置达到邮件告警的目的. 一.错误告警 如下配置,所有Error级别的log发送邮件告警给re ...

  3. vscode调试pomelo和pomelo使用vscode调试

    使用vscode 通过端口remote attach进行调试 pomelo. 0. 网上好多调试pomelo的都是webstorm.或者vscode调试node的教程.但没找到vscode调试pome ...

  4. IE兼容性视图,新增元素导致白页面

    环境:     浏览器:IE8/9浏览器[兼容性视图]     doctype:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transit ...

  5. chrome中,BackstopJS 使用cookie文件后依旧提示需要登录

    1. 本地环境: apache-tomcat:7.05,jdk8, backstopJS:latest-version 配置tomcat管理用户成功:手工访问tomcat应用内部服务正常: 2.  问 ...

  6. xstream中几个注解的含义和用法(转)

    XStream是个很强大的工具,能将Java对象和xml之间相互转化.xstream不在意java类中成员变量是私有还是公有,也不在乎是否有默认构造函数.它调用方式也非常简单:从xml对象转化为jav ...

  7. Understanding and Creating OWIN Middlewares - Part 1

    In my previous article, What is OWIN? A Beginners Guide we learned the basics of OWIN and the benefi ...

  8. Continue SQL query even on errors

    trymysql --force < sample_data.sql Mysql help section says -f, --force         Continue even if w ...

  9. BZOJ 2761: [JLOI2011]不重复数字 hash哈希

    题目就不贴了 点我看题 题意:这题题意很简明,就是给一个序列,把序列里相同的删掉,然后输出,按原数列顺序. 思路:这题之前QZZ和ZN大神犇叫我去做,辣时还不会hash,就留着了.最近某夏令营学会了h ...

  10. 爬虫框架Scrapy之案例一

    阳光热线问政平台 http://wz.sun0769.com/index.php/question/questionType?type=4 爬取投诉帖子的编号.帖子的url.帖子的标题,和帖子里的内容 ...