首页 > 其他分享 >go实现聊天室【简洁版】

go实现聊天室【简洁版】

时间:2022-12-14 09:12:32浏览次数:36  
标签:聊天室 简洁 string err text clnt go net conn

go写了一个简洁版的聊天室实现功能
1.广播用户登录
2.广播群发消息
3.修改当前登录用户名
4.广播用户退出

服务端代码

package main

import (
	"log"
	"net"
	"strings"
)
type Client struct {
	C chan string
	Name string
	Addr string
}
var onLineMap map[string]Client
var  Message=make(chan string)
var isQuit=make(chan bool)

func WriteMsg(clnt Client, conn net.Conn){
	for msg:=range clnt.C {
		msg:=msg+"\n"
		conn.Write([]byte(msg))
	}
}

//广播所有用户消息
func tellAllUser(conn net.Conn,clnt Client){
	addr:= conn.RemoteAddr().String()
	buf:=make([]byte,1024)
	for {
		n,err:=conn.Read(buf)
		if n == 0 {
			log.Println("客户端退休")
			isQuit <-true
			return
		}
		if err != nil {
			log.Println("system is errors")
			return
		}
		content:=string(buf[:n])
		if content == "who" && len(content) == 3 {
			conn.Write([]byte("用户列表:\n"))
			for _,item:=range onLineMap {
				userInfo:= item.Addr+":"+item.Name+"\n"
				conn.Write([]byte(userInfo))
			}
		}else if len(content) >=8 && content[:6] == "rename"{
			newName:= strings.Split(content,"|")
			clnt.Name = newName[1]
			onLineMap[addr]=clnt
		}else{
			msg:="客户端消息: "+content
			Message <-msg
		}

	}
}


//处理连接出来的用户
func HandleConnect(conn net.Conn){
	netAddr:=conn.RemoteAddr().String()
	clnt:=Client{
		C:make(chan string),
		Name: netAddr,
		Addr: netAddr,
	}
	//创建专门当前用户发送消息的go协程
	onLineMap[netAddr]=clnt
	go WriteMsg(clnt,conn)
	//发送用户上校消息导全局通道
	msg:="欢迎用户:"+netAddr+"登录"
	Message<-msg

	go tellAllUser(conn,clnt)//广播所有用户消息

	for {
		select {
			case <-isQuit:
			delete(onLineMap,netAddr)
			Message <-clnt.Name+"login out"
			return
		}
	}
}
func Manager(){
	onLineMap=make(map[string]Client)
	for {
		msg:=<-Message
		for _,clnt:=range onLineMap {
			clnt.C <-msg
		}
	}
}

func main(){
	listener,err:= net.Listen("tcp","127.0.0.1:8007")
	if err != nil {
		log.Println("open tcp is errors")
	}
	defer listener.Close()
	go Manager()//存储用户消息
	for {
		conn,err:=listener.Accept()
		if err != nil {
			log.Println("Accept is erros")
		}
		go HandleConnect(conn)
	}

}

客户端代码

package main

import (
	"bufio"
	"fmt"
	"io"
	"net"
	"os"
	"strings"
)
func read(conn net.Conn){
	defer conn.Close()
	var buf[1024]byte
	reader:=bufio.NewReader(conn)
	for {
		n,err:=reader.Read(buf[:])
		if err  == io.EOF {
			break
		}
		if err != nil {
			return
		}
		recvStr:= string(buf[:n])
		fmt.Printf("收到服务端数据为:%v\n",recvStr)
	}
}

func main(){
	conn,err:= net.Dial("tcp","127.0.0.1:8007")
	if err != nil {
		fmt.Println("is erro")
	}
	go read(conn)
	reader:= bufio.NewReader(os.Stdin)
	fmt.Printf("%v,\n","请写入内容")
	for {
		text,_:=reader.ReadString('\n')
		text = strings.TrimSpace(text)
		if text == "exit" {
			break
		}
		conn.Write([]byte(text))
	}
	conn.Close()
}

标签:聊天室,简洁,string,err,text,clnt,go,net,conn
From: https://www.cnblogs.com/zh718594493/p/16981201.html

相关文章

  • go 镜像输出一个树 mac模式
    递归写的很low,mac模式packagemainimport"fmt"typeTreeNodestruct{ Valueint Left*TreeNode right*TreeNode}funcmirrorTree(root*TreeNode)*TreeNo......
  • golang的net包net.Dial和net.Listen
    在Go中,网络编程主要通过net包实现。支持包括TCP/IP、UDP、域名解析和Unix域socket等连接,此外,还通过net/http,net/rpc等提供了HTTP,RPC等主流应用层的连接协议。TCP服......
  • Go-15 Golang语言中time包以及日期函数
    packagemainimport( "fmt" "time")//Golangtime包以及日期函数funcmain(){ /* 1.time.Now()获取当前时间 2.Format方法会格式化输出日期字符串 3......
  • Django路由层补充,视图层解析
    目录Django路由层补充,视图层解析今日内容概要今日内容详细路由分发名称空间虚拟环境视图层之必会三板斧前端出现乱码JsonResponse对象视图层之request对象获取文件视图层之......
  • django框架四
    路由分发django中每个应用都可以有自己独立的urls.py(路由层)、templates文件夹(模板层)、static文件夹(静态文件资源)。基于以上特性多人开发项目就可以完全解耦合,之后......
  • Django路由层相关知识
    昨日内容回顾Django请求生命周期图处理一条请求与7个部分关联:客户端、网关服务接口、Django中间件、路由层、视图层、模板层、模型层。Django路由层的匹配静态......
  • Django之视图层
    目录视图层必会三板斧伪静态(了解)JsonResponse对象request对象获取文件FBV与CBVCBV源码解析模板层视图层django视图层:Django项目下的views.py文件,它的内部是一系列的函......
  • django视图层详解
    内容概要路由分发名称空间虚拟环境视图层必会三板斧视图层JsonResponse对象视图层request对象获取文件视图层FBV与CBVCBV源码剖析内容详细路由发分发django支......
  • django模板层
    模板层{{}}:主要是与数据值相关{%%}:主要与逻辑相关django的模板语法是自己写的跟jinja2不一样针对需要加括号调用的名字django模板语法会自动加括号调用,我们只需要......
  • 进入python的世界_day51_Django之视图层、模板层
    一、路由分发django中应用都可以有自己独立的urls.py文件templates文件夹static文件夹能够让基于django开发的多个应用完全独立便于小组开发能分能收整个dj项目下......