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