golang实现简单的聊天室
一、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实现简单的聊天室的更多相关文章
- 简单的聊天室代码php+swoole
php swoole+websocket 客户端代码 <!DOCTYPE html> <html> <head> <title></title&g ...
- ASP.NET Signalr 2.0 实现一个简单的聊天室
学习了一下SignalR 2.0,http://www.asp.net/signalr 文章写的很详细,如果头疼英文,还可以机翻成中文,虽然不是很准确,大概还是容易看明白. 理论要结合实践,自己动手做 ...
- [SignalR]一个简单的聊天室
原文:[SignalR]一个简单的聊天室 1.说明 开发环境:Microsoft Visual Studio 2010 以及需要安装NuGet. 2.添加SignalR所需要的类库以及脚本文件: 3. ...
- Android简单的聊天室开发(client与server沟通)
请尊重他人的劳动成果.转载请注明出处:Android开发之简单的聊天室(client与server进行通信) 1. 预备知识:Tcp/IP协议与Socket TCP/IP 是Transmission ...
- Netty学习笔记(四) 简单的聊天室功能之服务端开发
前面三个章节,我们使用了Netty实现了DISCARD丢弃服务和回复以及自定义编码解码,这篇博客,我们要用Netty实现简单的聊天室功能. Ps: 突然想起来大学里面有个课程实训,给予UDP还是TCP ...
- 玩转Node.js(四)-搭建简单的聊天室
玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一 ...
- 用ServletContext做一个简单的聊天室
这里主要是ServletContext的一个特性:ServletContext是一个公共的空间,可以被所有的客户访问.由此可见ServletContext比cookie和session的作用范围要大[ ...
- nodejs与websocket模拟简单的聊天室
nodejs与websocket模拟简单的聊天室 server.js const http = require('http') const fs = require('fs') var userip ...
- 基于websocket实现的一个简单的聊天室
本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...
- WebSocket介绍和一个简单的聊天室
WebSocket是什么呢? WebSocket一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范, ...
随机推荐
- SQL语句使用
目录 一:sql语句 1.什么是SQL语句? 二:基本SQL语句之库操作 三:基本SQL语句之表操作 1.查看当前所在库名称 2.切换数据库 四:基本SQL语句之记录操作 五:创建表的完整语法 六:操 ...
- APP异常测试点汇总
在测试APP时异常测试是非常必要的. 安装卸载中的异常测试 一.安装 安装过程中设备重启 安装过程中息屏 安装过程中断网 安装过程中切换网络 安装过程中收到短信提醒 安装过程中收到来电提醒 安装过程中 ...
- Potree 002 Desktop开发环境搭建
1.工程创建 我们使用Visual Studio 2022开发,把下载好后的PotreeDesktop源码添加到Visual Studio中. 打开Visual Studio 2022,新建Asp.N ...
- 【SpringBoot实战专题】「开发实战系列」从零开始教你舒服的使用RedisTemplate操作Redis数据
SpringBoot快速操作Redis数据 在SpringBoot框架中提供了spring-boot-starter-data-redis的依赖组件进行操作Redis服务,当引入了该组件之后,只需要配 ...
- s2-005
漏洞名称 (CVE-2010-1870) - XWork ParameterInterceptors旁路允许远程命令执行 利用条件 Struts 2.0.0 - Struts 2.1.8.1 漏洞原理 ...
- BC4-牛牛学说话之-浮点数
题目描述 会说整数之后,牛牛开始尝试浮点数(小数),输入一个浮点数,输出这个浮点数. 输入描述 输入一个浮点数 输出描述 输出一个浮点数,保留三位小数 示例 1 输入:1.359578 输出:1.36 ...
- CF1779C Least Prefix Sum 题解
CF链接:Least Prefix Sum Luogu链接:Least Prefix Sum $ {\scr \color {CornflowerBlue}{\text{Solution}}} $ 先 ...
- python3.10调用邮件SMTP报错: ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:997)解决
一: python3.10调用邮件SMTP报错: ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake fa ...
- Navicat可视化软件及多表查询的方法
Navicat可视化软件及多表查询的方法 一.多表查询的两种方法 1.连表操作 1.内连接 inner join ----->> 只连接两张表中公有的数据部分 select * from ...
- 【学习日志】@NotNull注解不生效问题
后端API需要接受fe传过来的参数,就必然涉及到参数校验. Spring提供了使用注解进行非法判断的引用(需要主动引入),继承自 spring-boot-starter-parent <depe ...