下面我将为你详细讲解“Go语言实现一个简单的并发聊天室的项目实战”的完整攻略。
1. 确定项目需求
在开始我们的项目之前,需要先明确项目需求。这是任何项目开始之前都必须要做的。在聊天室项目中,我们需要实现以下需求:
- 支持多个用户同时在线
- 用户能够发送消息到聊天室中
- 用户能够接收到来自其他用户的消息
- 用户能够退出聊天室
2. 设计数据结构
在开始编写代码之前,我们需要设计一下数据结构。在本项目中我们需要用到以下三种数据结构。
User
type User struct {
ID int
Name string
Conn net.Conn
}
每个用户都有唯一的ID,名字和和他(她)建立连接的网络连接。
Message
type Message struct {
SenderID int
ReceiverID int
Content string
}
每个消息都有发送者和接受者的ID和内容。
ChatRoom
type ChatRoom struct {
Users []*User
Messages []*Message
}
聊天室包含所有在线用户和所有已经发送的消息。
3. 编写代码
3.1 初始化聊天室和用户
func main() {
chatRoom := &ChatRoom{}
users := make([]*User, 0)
}
3.2 添加用户
func (c *ChatRoom) addUser(user *User) {
c.Users = append(c.Users, user)
}
3.3 发送消息
func (c *ChatRoom) sendMessage(message *Message) {
c.Messages = append(c.Messages, message)
}
3.4 广播消息
func (c *ChatRoom) broadcastMessage(message *Message) {
for _, user := range c.Users {
if user.ID != message.SenderID {
fmt.Fprintf(user.Conn, "[%s]: %s\n", user.Name, message.Content)
}
}
}
3.5 客户端处理
func handleConn(conn net.Conn, chatRoom *ChatRoom) {
user := &User{
ID: rand.Int(),
Name: "user",
Conn: conn,
}
chatRoom.addUser(user)
fmt.Fprintf(conn, "Welcome to the chat room, your ID is %d\n", user.ID)
scanner := bufio.NewScanner(conn)
for scanner.Scan() {
msg := scanner.Text()
if msg == "quit" {
fmt.Fprintf(conn, "Goodbye!\n")
conn.Close()
break
}
message := &Message{
SenderID: user.ID,
ReceiverID: 0,
Content: msg,
}
chatRoom.sendMessage(message)
go chatRoom.broadcastMessage(message)
}
}
3.6 启动服务
func main() {
chatRoom := &ChatRoom{}
users := make([]*User, 0)
ln, err := net.Listen("tcp", ":8888")
if err != nil {
log.Fatal(err)
}
defer ln.Close()
for {
conn, err := ln.Accept()
if err != nil {
log.Fatal(err)
}
go handleConn(conn, chatRoom)
}
}
4. 示例说明
示例1:启动服务器
在终端中运行以下命令启动服务器:
$ go run main.go
示例2:启动客户端
在终端中运行以下命令启动客户端:
$ telnet localhost 8888
示例3:用户发送消息
用户可以使用telnet向聊天室发送消息:
$ telnet localhost 8888
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Welcome to the chat room, your ID is 999
Hello!
示例4:用户在聊天室中广播消息
所有在线用户都能接收到其他用户的消息:
$ go run main.go
[user1]: Hello
[user2]: How are you?
以上就是“Go语言实现一个简单的并发聊天室的项目实战”的完整攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go语言实现一个简单的并发聊天室的项目实战 - Python技术站