网络通信4:TCP广播

栏目: 服务器 · 发布时间: 7年前

内容简介:版权声明:本文为博主尹成联系QQ77025077,微信18510341407原创文章,欢迎转载侵权不究。 https://blog.csdn.net/yincheng01/article/details/84135842

版权声明:本文为博主尹成联系QQ77025077,微信18510341407原创文章,欢迎转载侵权不究。 https://blog.csdn.net/yincheng01/article/details/84135842

服务端实现

import (
	"fmt"
	"net"
		"os"
	"strings"
)

//存储客户端连接, key,ip端口,value 链接对象
var onlineConnsMap = make(map[string]net.Conn)

//消息队列,缓冲区
var messageQueue = make(chan string, 1000)

//消息,处理程序退出
var quitchan = make(chan bool)

func CheckErrorS(err error) {
	if err != nil {
		fmt.Println("网络错误", err.Error())
		os.Exit(1)
	}
}

func Processinfo(conn net.Conn) {
	buf := make([]byte, 1024) //开创缓冲区
	defer func() {
		//关闭连接
		conn.Close()
		fmt.Println("连接已关闭:",conn.RemoteAddr())
	}()

	for {
		n, err := conn.Read(buf) //读取数据
		if err != nil {
			fmt.Println("读取客户端消息出错,err=",err)
			break
		}

		if n != 0 {
			//消息处理,
			message := string(buf[0:n])
			fmt.Printf("受到客户端%v消息:%s\n",conn.RemoteAddr(),message)

			//消息队列存储消息
			messageQueue <- message
			fmt.Println("该条消息已加入队列...")

		}else{
			fmt.Println("读取客户端消息长度为0")
		}
	}

}

//消息的协程
func consumeMessage() {
	for {
		select {
		case message := <-messageQueue: //取出消息
			fmt.Println("已从队列中取出消息")
			strs := strings.Split(message, "#") //字符串切割
			if len(strs) > 1 {

				//127.0.0.1:12345#去死

				//截取地址并裁减头尾空白
				addr := strs[0]
				addr = strings.TrimSpace(addr)

				//截取内容
				msg := strs[1]

				//给所有客户端群发此消息
				/*for addr, conn := range onlineConnsMap { //循环在线列表
					_, err := conn.Write([]byte(msg))
					fmt.Println("服务器发送消息", msg, "给", addr)
					if err != nil {
						fmt.Println("在线链接发送失败")
					}
				}*/

				//@某人,发消息
				if conn, ok := onlineConnsMap[addr]; ok {
					_, err := conn.Write([]byte(msg))
					fmt.Println("服务器发送消息", msg)
					if err != nil {
						fmt.Println("在线链接发送失败")
					}
				}


			}
		case <-quitchan: //处理退出
			os.Exit(0)
		}
	}
}

func main() {
	//建立TCP服务器
	listener, err := net.Listen("tcp", "127.0.0.1:8898")
	CheckErrorS(err)
	defer listener.Close() //关闭网络

	fmt.Println("服务器正在等待")

	go consumeMessage()

	for {
		conn, err := listener.Accept() //新的客户端连接
		CheckErrorS(err)

		//处理每一个客户端
		addr := fmt.Sprint(conn.RemoteAddr()) //取出地址
		onlineConnsMap[addr] = conn

		fmt.Println("客户端列表")
		fmt.Println("-------------------")
		for key := range onlineConnsMap { //循环每一个链接
			fmt.Println(key)
		}

		go Processinfo(conn)
	}

}

客户端呢实现

import (
	"fmt"
	"net"
	"bufio"
	"os"
)

func CheckErrorC(err error) {
	if err != nil {
		fmt.Println("网络错误", err.Error())
	}
}

func MessageSend(conn net.Conn) {
	var input string
	for {
		reader := bufio.NewReader(os.Stdin) //读取键盘输入
		data, _, _ := reader.ReadLine()     //读取一行
		input = string(data)                //键盘输入转化为字符串

		if input == "exit" {
			conn.Close()
			fmt.Println("客户端关闭")
			break
		}

		_, err := conn.Write([]byte(input)) //输入写入字符串
		fmt.Println("发送消息", input)
		if err != nil {
			conn.Close()
			fmt.Println("客户端关闭")
			break
		}

	}
}

func main() {
	conn, err := net.Dial("tcp", "127.0.0.1:8898") //建立TCP服务器
	defer conn.Close()                             //延迟关闭网络连接
	CheckErrorC(err)                               //检查错误

	go MessageSend(conn)                           //开启一个协程,处理发送
	//conn.Write([]byte("hello  nimei"))

	//协程,负责收取消息
	buf := make([]byte, 1024)
	for {
		numOfBytes, err := conn.Read(buf)
		CheckErrorC(err)
		fmt.Println("收到服务器消息", string(buf[:numOfBytes]))
	}

	fmt.Println("客户端关闭")

}

学院 Go 语言视频主页

https://edu.csdn.net/lecturer/1928

[清华团队带你实战区块链开发]

( https://ke.qq.com/course/344443?tuin=3d17195d )

扫码获取海量视频及源码 QQ群:721929980

网络通信4:TCP广播

以上所述就是小编给大家介绍的《网络通信4:TCP广播》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

科技投资新时代:TMT投资方法、趋势与热点聚焦

科技投资新时代:TMT投资方法、趋势与热点聚焦

马军、宋辉、段迎晟 / 人民邮电出版社 / 2018-3 / 69.00

中国 TMT 行业(科技、媒体及通信)起步较晚但充满朝气。2017 年,TMT 板块的IPO 数量占到了总数的四分之一;对于投资者来说,投资 TMT 的收益非常可观。那么,TMT 的投资趋势如何? TMT 行业又有哪些投资热点? 本书立足于 TMT 投资现状,在介绍了 TMT 投资的基本概念之后,作者详细讲述了TMT 投资的基本研究方法、分析视角、整体行情及趋势分析,同时从行业视角分析了包括......一起来看看 《科技投资新时代:TMT投资方法、趋势与热点聚焦》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具