围棋语言聊天室演示
最编程
2024-03-08 13:16:37
...
package main
import (
"container/list"
"encoding/json"
"fmt"
uuid "github.com/satori/go.uuid"
"net"
"strings"
)
type GlobalConnInfo struct {
ClientConnMap map[string]net.Conn
ClientList list.List
}
type RespModel struct {
Code int
Msg string
Data any
}
func main() {
//这里维护了客户客户端的连接信息
globalConnInfo := GlobalConnInfo{ClientConnMap: make(map[string]net.Conn), ClientList: list.List{}}
//监听端口
listener, _ := net.Listen("tcp", ":9876")
fmt.Println("TCP服务器启动监听")
for {
//Listen返回成功后,这个服务会进入一个循环,调用net.Listener 的 Accept 方法接收新客户端连接
//在没有新连接的时候,这个服务会阻塞在 Accept 调用上,直到有客户端连接上来,Accept 方法将返回一个 net.Conn 实例,用于和新连上的客户端进行通信。
conn, _ := listener.Accept()
fmt.Println("【新的连接上来了, 启动新的协程处理】", conn)
//启动go协程, 处理conn的逻辑
go doSyncHandler(conn, globalConnInfo)
}
}
func doSyncHandler(conn net.Conn, globalConnInfo GlobalConnInfo) {
//重命名函数
name := serverFirstRename(conn)
//将name作为key维护连接
globalConnInfo.ClientConnMap[name] = conn
globalConnInfo.ClientList.PushBack(name)
//核心交互逻辑
for {
//定义读取数据读缓存数组
var readBytes []byte = make([]byte, 1024)
size, _ := conn.Read(readBytes)
//客户端给服务器发了数据服务端才返回
if size >= 0 {
action := strings.TrimSpace(string(readBytes))[:size]
fmt.Println("【server】[client ---> server] : ", action)
if action == "1" {
resultBytes, _ := json.Marshal(RespModel{Code: 200, Msg: "当前系统在线用户", Data: globalConnInfo})
conn.Write(resultBytes)
} else if action == "2" {
resultBytes, _ := json.Marshal(RespModel{Code: 200, Msg: "新用户昵称", Data: uuid.NewV1().String()[:32]})
conn.Write(resultBytes)
} else if action == "3" {
resultBytes, _ := json.Marshal(RespModel{Code: 200, Msg: "退出成功", Data: nil})
conn.Write(resultBytes)
} else {
resultBytes, _ := json.Marshal(RespModel{Code: 200, Msg: "暂未开发的操作, 请重新选择操作", Data: nil})
conn.Write(resultBytes)
}
}
}
}
func serverFirstRename(conn net.Conn) string {
//服务端随机命名
var name string = uuid.NewV1().String()[:32]
//返回服务端命名结果
firstWriteBytes := []byte(name)
conn.Write(firstWriteBytes)
fmt.Println("【server】[server ---> client] 服务端命名结果: ", string(firstWriteBytes))
return name
}
推荐阅读
-
围棋语言 - 我的表演我做主
-
揭开围棋语言条件反射的神秘面纱:深入探讨三大定律
-
围棋语言社区] epoll 解释
-
围棋语言与电子语言:哪个更适合您?
-
面试要点(背诵)--围棋语言八大系列!
-
提高大型语言模型 (LLM) 性能的四种数据清理技术--演示:清理 GAI 文本输入
-
围棋 - 围棋语言 通道 Channel 是 Go 中的一种核心类型,可以把它看作是一个管道,并发的核心单元可以通过它发送或接收数据进行通信。 它的操作符是箭头 <- 。 ch <- v // 发送值 v 到通道 ch v := <-ch // 从通道 ch 接收数据并赋值给 v (箭头指向数据流) 与 map 和 slice 数据类型一样,通道必须在创建后才能使用。 ch := make(chan int) ch := make(chan int)
-
人工智能中的围棋语言趋势
-
国内外围棋语言应用现状分析
-
围棋语言学习第二天:注释和变量