服务端流程图如下:

package main

import (
"fmt"
"net"
) // 客户端结构体
type Client struct {
//用户通信
C chan string
//客户端名称
name string
//客户端地址
addr string
} //map存储在线用户
var is_online map[string]Client //消息通讯
var messages = make(chan string) //广播全局消息到客户端
func Message() {
is_online = make(map[string]Client) // 循环读取 message 通道中的数据
for {
// 通道 message 中有数据读到 msg 中。 没有,则阻塞
msg := <-messages // 一旦执行到这里,说明message中有数据了,解除阻塞。 遍历 map
for _, client := range is_online {
client.C <- msg // 把从Message通道中读到的数据,写到 client 的 C 通道中。
}
}
} //生产消息函数
func MakeMsg(client Client, msg string) (buf string) {
buf = "[" + client.addr + "]" + client.name + ": " + msg
return
} //发送消息给在线客户端
func WriteMsgToClient(conn net.Conn, client Client) {
for msg := range client.C {
conn.Write([]byte(msg))
}
} func Handler(conn net.Conn) { //把当前客户端添加到在线map中
addr := conn.RemoteAddr().String()
client := Client{make(chan string), addr, addr}
//将当前客户端加入在线字典列表中
is_online[addr] = client //创建一个协程,专门给当前客户端发消息
go WriteMsgToClient(conn, client) //将用户上线的消息放到全局消息中
messages <- MakeMsg(client, "login") // 创建一个新协程,循环读取用户发送的消息,广播给在线用户
go func() {
for {
buf := make([]byte, 2048)
//读取客户端数据
n, _ := conn.Read(buf)
if n == 0 {
fmt.Printf("用户%s退出登录\n", client.name)
//将当前用户从在线字典中删除
delete(is_online, addr)
//通知其他客户端该用户退出登录
messages <- MakeMsg(client, "logout")
return
}
msg := string(buf[:n])
//将客户端发的消息加入到全局消息通道中
messages <- MakeMsg(client, msg)
}
}()
//让协程不停止运行
for { }
} func main() {
//奖励tcp监听
listen, err := net.Listen("tcp", ":8000")
if err != nil {
fmt.Println(err.Error())
return
}
defer listen.Close() //创建协程处理消息
go Message() for {
//阻塞等待客户端连接
conn, err := listen.Accept()
if err != nil {
fmt.Println(err.Error())
}
//创建协程处理客户端事件
go Handler(conn)
defer conn.Close()
}
}

效果图如下:

Go语言 之TCP聊天室的更多相关文章

  1. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  2. 基于tcp和多线程的多人聊天室-C语言

    之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...

  3. 基于TCP/IP的局域网聊天室---C语言

    具备注册账号,群聊,查看在线人员信息,私发文件和接收文件功能,因为每个客户端只有一个属于自己的socket,所以无论客户端是发聊天消息还是文件都是通过这一个socket发送, 这也意味着服务器收发任何 ...

  4. Go语言实践_实现一(服务器端)对多(客户端)在线聊天室

    一.目的 运用Go语言中的goroutine和通道实现一个简单的一个服务器端对多个客户端的在线聊天 软件环境:Goland,Go1.9 代码仓库链接 二.设计思路 与一对一的设计思路类似,就是加了个线 ...

  5. Go语言实践_实现一(客户端)对一(服务器端)聊天室

    一.目的 使用Go语言实现一个服务器端与客户端的聊天室. 软件:Goland,Go1.9 代码仓库地址 二.思路 1,首先启动服务器端,使用listen_socket函数监听IP地址上的客户端连接: ...

  6. C语言实现聊天室(windows版本)

    来源:微信公众号「编程学习基地」 目录 C语言聊天室 运行效果 分析设计 多线程 线程的同步 服务端设计 遇到的问题 C语言聊天室 基于 tcp 实现群聊功能,本项目设计是在windows环境下基于套 ...

  7. JAVA基础知识之网络编程——-基于TCP通信的简单聊天室

    下面将基于TCP协议用JAVA写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ...

  8. 奇妙的go语言(聊天室的开发)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 这是一篇关于聊天室开发的博客,原来文章的地址来自于此.这篇文章非常具有代表性,对于代码中的函数 ...

  9. 网络编程TCP协议-聊天室

    网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...

随机推荐

  1. Project Oberon

    Project Oberon Project Oberon  http://www.projectoberon.com/ Project Oberon 28.11.2018 / 11.12.2018 ...

  2. web pack备忘

    全局安装:npm install webpack -g npm i module_name -S = > npm install module_name --save 写入到 dependenc ...

  3. cocos发布遇到的问题

    学习第二天,用官方的demo进行打包,出现以下问题: 第一个问题: 报错信息:scene 没有保存,请先保存相关信息再进行构建. 解决方案:ctrl+s保存即可,一开始没注意前面的英文是场景的意思 第 ...

  4. WordPress,SAP Kyma和微信三者的集成

    我们来继续学习如何在实战中使用SAP Kyma. Jerry在之前的文章里,分别介绍了如何本地搭建WordPress实例: 什么?在SAP中国研究院里还需要会PHP开发? 以及如何把这个本地搭建的Wo ...

  5. [LeetCode] 784. 字母大小写全排列 ☆☆☆(回溯、深度优先遍历)

    https://leetcode-cn.com/problems/letter-case-permutation/solution/shen-du-you-xian-bian-li-hui-su-su ...

  6. CentOS 7安装VMware Tools

    1.启动centos,在此虚拟集中点击VMware Workstation中的虚拟机菜单,点击安装VMware Tools,如果已经安装过点击重新安装VMware Tools 2.查看/dev目录下文 ...

  7. 【问题】为啥WMWare Workstation里面虚拟机的网关默认是NAT网关

    今天做KickStart自动化安装实验,无意中发现一个奇怪现象. 先描述下我的实验环境:笔记本Win10,安装了WMWare Workstation,在WMWare Workstation上面安装了C ...

  8. CentOS 8 (1905)系统安装

    本章内容: CentOS 8 的安装(CentOS-8-1905) 一.安装光盘,选择Install CentOS Linux 8.0.1905 二.选择系统语言,我这里选的是英文,也可以选择中文,往 ...

  9. Python3+Appium学习笔记05-报错及解决方法

    记录一下使用期间各种报错和解决方法,毕竟搜了半天才找到解决方法.另外提示一下.优先看官方文档. 报错前面都是一样,就是说在处理的时候,服务器发生了一个未知的错误.然后才是具体报错信息 1)seleni ...

  10. We're sorry but mobile doesn't work properly without JavaScript enabled. Please enable it to continue.

    vue过程中遇见这个问题:We're sorry but mobile doesn't work properly without JavaScript enabled. Please enable ...