功能需求:

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

效果图:

群聊:

 

单聊:

服务端:

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. MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

    悲观锁: 顾名思义,很悲观,就是每次拿数据的时候都认为别的线程会修改数据,所以在每次拿的时候都会给数据上锁.上锁之后,当别的线程想要拿数据时,就会阻塞,直到给数据上锁的线程将事务提交或者回滚.传统的关 ...

  2. 虚拟机Linux系统忘记密码的情况下,修改root或其他用户密码

    使用场景 linux管理员忘记root密码,需要进行找回操作. 注意事项:本文基于centos7环境进行操作,由于centos的版本是有差异的,继续之前请确定好版本. 步骤 一.重启系统,在开机过程中 ...

  3. Ubuntu server 安装的mysql数据库忘记密码的解决方法

    客户端连接时报错MySQL数据库出现:Error 1045错误时,就表明输入的用户名或密码错误被拒绝访问了. 解决办法可以分为以下几步: 1.修改mysql配置文件,使得可以无密码登录mysql su ...

  4. Python3.x:报错POST data should be bytes, an iterable of bytes

    Python3.x:报错POST data should be bytes, an iterable of bytes 问题: python3.x:报错 POST data should be byt ...

  5. c语言数据类型字节长度

    突然间就想到了long和int到底什么区别(发现有很多问题都是突然间想到的),然后百度.google各种查找,各种书籍:<C++ Primer>.<C程序设计语言>查看,终于明 ...

  6. 百度console输出

    try{ if(window.console&&window.console.log) { console.log("一张网页,要经历怎样的过程,才能抵达用户面前?\n一位新 ...

  7. DOS/BAT批处理if exist else 语句的几种用法

    在DOS批处理命令中常常会通过if语句来进行判断来执行下面的命令, 那么批处理if语句怎么用呢,下面学无忧小编就来说说有关批处理if以及if exist else语句的相关内容.一.批处理if书写格式 ...

  8. selenium webdriver模拟鼠标键盘

    在测试使用Selenium webdriver测试WEB系统的时候,用到了模拟鼠标.键盘的一些输入操作. 1.鼠标的左键点击.双击.拖拽.右键点击等: 2.键盘的回车.回退.空格.ctrl.alt.s ...

  9. Elasticsearch之几个重要的分词器

    前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch之中文分词器 Elasti ...

  10. BZOJ3236: [AHOI2013]作业

    BZOJ3236: [AHOI2013]作业 题目描述 传送门 行,我知道是Please contact lydsy2012@163.com! 传送门2 题目分析 这题两问还是非常,emmmm. 首先 ...