一、server端

package main

import (
"fmt"
"net"
) var message = make(chan string) type client struct {
Name string
Addr string
C chan string
} var online = make(map[string]client) func main() {
listener, err := net.Listen("tcp", "127.0.0.1:8089")
if err != nil {
fmt.Println("listen err:", err)
return
}
go manager()
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println(err)
continue
}
go userlogin(conn)
}
}
func userlogin(conn net.Conn) {
defer conn.Close()
addr := conn.RemoteAddr().String()
//将用户加入到在线用户列表
cli := client{addr, addr, make(chan string)}
online[addr] = cli
go writeToclient(cli, conn)
//将用户登录的信息发送到全局message
message <- fmt.Sprintf("用户%s登录", addr) for {
content := make([]byte, 128)
n, err := conn.Read(content)
if err != nil {
break
}
txt := string(content[:n])
if txt == "quit" {
delete(online, addr)
message <- fmt.Sprintf("用户%s退出!!!", addr)
break
}
txt = addr + " 说话:" + txt
message <- txt
}
} func manager() {
for {
msg := <-message
fmt.Println("manager管理", msg)
//把上线下线的消息通知给所有用户
for _, user := range online {
user.C <- msg
}
}
}
func writeToclient(cli client, conn net.Conn) {
for {
msg := <-cli.C
conn.Write([]byte("to client" + msg + "\n"))
}
}

二、client端

package main

import (
"bufio"
"fmt"
"io"
"net"
"os"
"strings"
) var ch1 = make(chan string) func main() { conn, err := net.Dial("tcp", "127.0.0.1:8089")
if err != nil {
return
}
go write(conn)
for {
fmt.Println(<-ch1)
fmt.Print("请输入:")
stdin := bufio.NewReader(os.Stdin)
speak, err := stdin.ReadString('\n')
if err != nil {
fmt.Println("send message error", err)
return
}
speak = strings.TrimSpace(speak)
conn.Write([]byte(speak))
if speak == "quit" {
break
} }
} func write(conn net.Conn) {
content := make([]byte, 128)
for {
n, err := conn.Read(content)
if err != nil {
if err == io.EOF {
return
}
fmt.Println("err", err)
}
ch1 <- string(content[:n])
}
}

golang实现简单的聊天室的更多相关文章

  1. 简单的聊天室代码php+swoole

    php swoole+websocket 客户端代码 <!DOCTYPE html> <html> <head> <title></title&g ...

  2. ASP.NET Signalr 2.0 实现一个简单的聊天室

    学习了一下SignalR 2.0,http://www.asp.net/signalr 文章写的很详细,如果头疼英文,还可以机翻成中文,虽然不是很准确,大概还是容易看明白. 理论要结合实践,自己动手做 ...

  3. [SignalR]一个简单的聊天室

    原文:[SignalR]一个简单的聊天室 1.说明 开发环境:Microsoft Visual Studio 2010 以及需要安装NuGet. 2.添加SignalR所需要的类库以及脚本文件: 3. ...

  4. Android简单的聊天室开发(client与server沟通)

    请尊重他人的劳动成果.转载请注明出处:Android开发之简单的聊天室(client与server进行通信) 1. 预备知识:Tcp/IP协议与Socket TCP/IP 是Transmission ...

  5. Netty学习笔记(四) 简单的聊天室功能之服务端开发

    前面三个章节,我们使用了Netty实现了DISCARD丢弃服务和回复以及自定义编码解码,这篇博客,我们要用Netty实现简单的聊天室功能. Ps: 突然想起来大学里面有个课程实训,给予UDP还是TCP ...

  6. 玩转Node.js(四)-搭建简单的聊天室

    玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一 ...

  7. 用ServletContext做一个简单的聊天室

    这里主要是ServletContext的一个特性:ServletContext是一个公共的空间,可以被所有的客户访问.由此可见ServletContext比cookie和session的作用范围要大[ ...

  8. nodejs与websocket模拟简单的聊天室

    nodejs与websocket模拟简单的聊天室 server.js const http = require('http') const fs = require('fs') var userip ...

  9. 基于websocket实现的一个简单的聊天室

    本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...

  10. WebSocket介绍和一个简单的聊天室

    WebSocket是什么呢? WebSocket一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范, ...

随机推荐

  1. bitlocker加密如何找密钥解锁

    步骤1:在其他设备上登录[微软账号],地址:https://account.microsoft.com 步骤2:找到[自己的设备],查看[Bitlocker]密钥登录进去能看到[设备],找要解锁的那台 ...

  2. dotTrace工具

    1.dotTrace简介: (1)dotTrace是一个包含了可用于.NET应用程序的性能分析器(dotTrace Performance)和内存分析器(dotTrace Memory)的套件: (2 ...

  3. java逻辑运算&&与&的区别

    本文主要阐述&&(短路与)和&(逻辑与)的运算异同:a && b 和 a&b : 共同之处是只有a和b同时为真时,结果才为真,否则为假 不同点在于 a ...

  4. 【c#】从外部复制文本、图片到我的软件中的解决方案(支持ppt,qq等)

    原文地址 https://www.cnblogs.com/younShieh/p/17010572.html 如果本文对你有所帮助,不妨点个关注和推荐呀,这是对笔者最大的支持~       我们先考虑 ...

  5. 分享一个项目中在用的图片处理工具类(图片缩放,旋转,画布格式,字节,image,bitmap转换等)

    using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Dra ...

  6. ONNX模型分析与使用

    本文大部分内容为对 ONNX 官方资料的总结和翻译,部分知识点参考网上质量高的博客. 一,ONNX 概述 深度学习算法大多通过计算数据流图来完成神经网络的深度学习过程. 一些框架(例如CNTK,Caf ...

  7. npm ERR! An unknown git error occurred

    今天根据 vue-element-admin 官网文档下载项目,初始化时报错 npm ERR! An unknown git error occurred 试了网上的大部分方法,都没用,最后在官网提供 ...

  8. 使用Python库pyqt5制作TXT阅读器(一)-------UI设计

    项目地址:https://github.com/pikeduo/TXTReader PyQt5中文手册:https://maicss.gitbook.io/pyqt-chinese-tutoral/p ...

  9. 如何在Github上创建一个新仓库

    Hi,欢迎大家在有空的时候做客[江涛学编程],这里是2023年的第6篇原创文章,新年新气象,在这里我祝读者朋友们都好好的, 老规矩,拍拍手,上菜. 今天没有啥东西要跟家人们分享,就两个字,看图!!! ...

  10. python之路33 MySQL 1

    存取数据的演变 1.文本文件 文件路径不固定:C:\aaa.txt D:\bbb.txt E:\ccc.txt 数据格式不统一:jason|123 jason$123 jason 123 2.软件开发 ...