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所补充规范, ...
随机推荐
- ES6——模块化
模块化 模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来. 一.浏览器使用ES6模块化方式一 使用script标签,将type属性设置为module,然后在script中书写代码 ...
- python 之匿名函数(lambda)
什么是匿名函数?匿名函数就是不用def关键字,使用lambda关键字定义的一个函数.匿名函数简约而不简单. 匿名函数的格式: lambda[ paramters1, paramters2 , .... ...
- 用 while 生成猜数字
import java.util.Random; import java.util.Scanner; public class zy2 { public static void main(String ...
- JUC源码学习笔记7——FutureTask源码解析,人生亦如是,run起来才有结果
系列文章目录和关于我 一丶我们在哪里会使用到FutureTask 基本上工作中和Future接口 打交道比较多,比如线程池ThreadPoolExecutor#sumbit方法,返回值就是一个Futu ...
- [LeetCode]最大连续1的个数
题目 代码 class Solution { public: int findMaxConsecutiveOnes(vector<int>& nums) { int length= ...
- ING国际银行基于Volcano的大数据分析平台应用实践
摘要:ING集团发表了<Efficient Scheduling Of High Performance Batch Computing For Analytics Workloads With ...
- 记一次使用gdb诊断gc问题全过程
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 上次解决了GC长耗时问题后,系统果然平稳了许多,这是之前的文章<GC耗时高,原因竟是服务流量小?> 然 ...
- 一文搞懂工作流审批(Java+activiti)快速开发+自定义工作流配置
前言 activiti工作流引擎项目,企业erp.oa.hr.crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求. 一.项目形式 springboot+v ...
- MySQL 如何实现表的创建、复制、修改与删除
MySQL中如何利用代码完成表的创建.复制.修改和删除?下面总结了在创建表的时候各字段的含义以及注意哪些问题,复制和修改及删除常用的代码. 一.创建表 --创建新表,如果存在则覆盖 drop tabl ...
- myatbis的一个好的封装
package com.pj.project4sp; import org.springframework.beans.factory.annotation.Autowired; import org ...