其他分享
首页 > 其他分享> > golang简易聊天室0.5

golang简易聊天室0.5

作者:互联网

目前实现的功能:
登录
广播
还需要实现:
rename
who
主动退出
超时退出(有竞争,需要上锁)

package main

import (
	"fmt"
	"net"
)

func main() {
	address := "127.0.0.1:8080"
	listener, err := net.Listen("tcp", address)
	if err != nil {
		fmt.Println("net.Listen(\"tcp\",address) err", err)
		return
	}
	go broadcast()
	fmt.Println("服务器启动成功")
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("listener.Accept() err", err)
			continue
		}
		fmt.Println("连接建立成功")
		go handler(conn)
	}
}

type User struct {
	Userid string
	Name   string
	mess   chan string
}

var allUsers = make(map[string]User)
var message = make(chan string, 10)

func handler(conn net.Conn) {
	useraddress := conn.RemoteAddr().String()
	newuser := User{
		Userid: useraddress,
		Name:   useraddress,
		mess:   make(chan string, 1),
	}
	allUsers[newuser.Userid] = newuser
	go writeBackToClient(&newuser, conn)
	fmt.Println("用户创建成功,newuserid", newuser.Userid, "newusername", newuser.Name)

	fmt.Println("处理业务逻辑")
	LoginInfo := fmt.Sprintf("[%s][%s] === > 上线了!\n", newuser.Userid, newuser.Name)
	message <- LoginInfo
	for {
		buf := make([]byte, 1024)
		cnt, err := conn.Read(buf)
		if err != nil {
			fmt.Println("conn.Read(buf) err", err)
			return
		}
		fmt.Printf("从[%s][%s]客户端读取 %s\n", newuser.Userid, newuser.Name, string(buf[:cnt-1]))
	}
}

func broadcast() {
	fmt.Println("broadcast 开始!")
	defer fmt.Println("broadcast 退出!")
	for {
		info := <-message
		fmt.Println("broadcast监听到message有消息: ", info[:len(info)-1])
		for _, user := range allUsers {
			user.mess <- info
		}
	}
}
func writeBackToClient(user *User, conn net.Conn) {
	fmt.Printf("%s开始监听自己的管道\n", user.Name)
	for data := range user.mess {
		fmt.Println("user:", user.Name, "监听到数据:", data[:len(data)-1])
		_, _ = conn.Write([]byte(data))
	}
	fmt.Printf("%s退出管道监听\n", user.Name)
}

客户端可以用nc命令或者实现一个golangsocket简单server-client通信

标签:聊天室,Name,err,fmt,0.5,golang,Println,newuser,conn
来源: https://blog.csdn.net/weixin_43769146/article/details/118280689