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所补充规范, ...
随机推荐
- 【JVM】经典垃圾回收器
本文已收录至Github,推荐阅读 Java随想录 微信公众号:Java随想录 CSDN: 码农BookSea 转载请在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益.让我们一起维护 ...
- vue 项目引入 echarts折线图
一.components文件下新建 lineCharts.vue <template> <div :class="className" :style=" ...
- [机器学习] sklearn支持向量机
支持向量机SVM(Support Vector Machine)是一种用来进行模式识别.分类.回归的机器学习模型. SVM原理描述 模型表示 以一个客户好坏分类为案例,客户信息如下所示: 客户信息数轴 ...
- day05-Vue02
Vue02 7.修饰符 7.1基本说明 修饰符(Modifiers)是以.指明的后缀,指出某个指令以特殊方式绑定 官方文档:修饰符 Vue中的修饰符有: 事件修饰符 按键修饰符 系统修饰符 事件修饰符 ...
- 琐碎的想法(五)for 的前世今生
for 起因 记得大学上C语言的课,第一次遇到的问题就是循环结构里面的 for. 选择结构的 if 非常易懂,和日常生活的判断没有区别. 循环结构的 while 同样比较好理解. 本质上是一个判断 如 ...
- LIS求解(包括优化)
首先,让我来看看LIS问题 Description 一个数的序列 bi,当 b1 < b2 < ... < bS 的时候,我们称这个序列是上升的.对于给定的一个序列(a1,a2,.. ...
- 算法之Dijkstra及其堆优化和SPFA:图上单源最短路径神器
签到题-- 题目传送门 SPFA算法 本人曾经写过一篇有关Bellman-ford的博,但就算是挂了优化的ford也只能过这道题的弱化版. 今天就先填个坑,先讲SPFA. 在这里我直接认为你们已经有一 ...
- 《深入理解Java虚拟机》第三章读书笔记(二)——HotSpot垃圾回收算法实现(OopMap,安全点安全区域,卡表,写屏障,三色标记算法)
系列文章目录和关于我 前面<深入理解Java虚拟机>第三章读书笔记(一)--垃圾回收算法我们学习了垃圾回收算法理论知识,下面我们关注下HotSpot垃圾回收算法的实现,分为以下几部分 对象 ...
- Spring AOP与AspectJ的对比及应用
1 简介 AOP,即面向切面编程是很常用的技术,特别是在Java Web开发中.而最流行的AOP框架分别是Spring AOP和AspectJ. 2 Spring AOP vs AspectJ Spr ...
- JSP第五次作业
1.教材P78-79 例4-9 1 <%@ page language="java" import="java.util.*" pageEncoding ...