golang实现聊天室(五)

Golang聊天室服务端广播
本文介绍了一个基于Golang实现的聊天室服务端,详细展示了如何通过TCP协议完成客户端与服务端的通信,实现消息的广播功能。服务端利用map存储客户端信息,通过广播消息给所有连接的客户端,实现了基本的聊天室功能。

golang实现聊天室(五)

完成服务端广播消息

server

package main

import (
	"fmt"
	"log"
	"math/rand"
	"net"
)


type Client_list struct {
	list map[net.Conn]string
}

func main() {
	client_list := Client_list{make(map[net.Conn]string, 0)}

	var conn, err = net.Listen("tcp","127.0.0.1:6888")
	if err != nil {
		return
	}

	for {
		c, err := conn.Accept()
		if err != nil {
			return
		}
		go client_list.Receive(c)
	}
}

//noinspection GoUnresolvedReference
func (client_list *Client_list) Receive(c net.Conn) {
	for {
		reveive_byte := make([]byte, 256)
		lens, err := c.Read(reveive_byte)
		if err != nil {
			log.Fatal("Receive error")
		}
		reveive_byte = reveive_byte[:lens]
		fmt.Printf("%s\n", reveive_byte)
		client_list.BroadMessage(c)
	}
}

func (client_list *Client_list) BroadMessage(c net.Conn) {
	// 用户信息唯一表,唯一标识码
	user := rand.Int() % 2
	client_list.list[c] = string(user)

	// 遍历map表
	for clientKey, _ := range client_list.list{
		if clientKey == c {
			continue
		}

		var _, err = clientKey.Write([]byte("服务器广播消息"))
		if err != nil {
			log.Fatal("Wrong about abroad message")
		}
	}

}

client1


package main

import (
	"fmt"
	"log"
	"net"
	"time"
)

func main() {
	var conn, err = net.DialTimeout("tcp", "127.0.0.1:6888", 30*time.Second)
	if err != nil {
		log.Fatal("conn error")
	}
	for {
		conn.Write([]byte("user 2\n "))
		time.Sleep(5 * time.Second)
		re_message := make([]byte, 255)
		length, err := conn.Read(re_message)
		if err != nil {
			return
		}
		re_message = re_message[:length]
		fmt.Printf("%s\n", re_message)
	}
	conn.Close()
}

client2


package main

import (
	"fmt"
	"log"
	"net"
	"time"
)

func main() {
	var conn, err = net.DialTimeout("tcp", "127.0.0.1:6888", 30*time.Second)
	if err != nil {
		log.Fatal("conn error")
	}
	for {
		conn.Write([]byte("user 2\n "))
		time.Sleep(5 * time.Second)
		re_message := make([]byte, 255)
		length, err := conn.Read(re_message)
		if err != nil {
			return
		}
		re_message = re_message[:length]
		fmt.Printf("%s\n", re_message)
	}
	conn.Close()
}

小结

  1. 完成了服务端客户端通信的基本模型
  2. 客户端建立连接,服务端存储客户端基本信息
  3. 服务端根据map信息广播消息

下期目标

  1. 指定用户名作为唯一信息map
  2. 从命令行接收发送信息
  3. 服务端广播唯一客户端发送的信息,给除这个客户端以外的客户端信息
  4. 当客户端退出时,服务端监测,并从map删除,广播消息给其他客户端
  5. 客户端可使用加密算法,对发送信息加密再发送
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值