Go语言实现一个简单的并发聊天室的项目实战

下面我将为你详细讲解“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技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 从并发到并行解析Go语言中的sync.WaitGroup

    从并发到并行解析Go语言中的sync.WaitGroup是一篇介绍Go语言中并发编程工具的文章。在该篇文章中,我们会深入了解到什么是并发和并行,以及如何使用sync.WaitGroup来协调并发和并行工作。 并发和并行的定义 并发是指同时执行多个代码段,但并不保证这些代码段的执行顺序。一个被操作系统调度器管理的Go程序就是一个并发程序。 并行是指同时执行多个…

    多线程 2023年5月16日
    00
  • 带你快速搞定java多线程(4)

    关于“带你快速搞定Java多线程(4)”这篇文章,下面我来给你详细讲解: 首先,这篇文章主要是讲解Java多线程中的线程池使用,包括线程池的定义、创建、使用和销毁等方面。下面从以下几个方面来介绍。 一. 线程池的定义 线程池是用于存放线程的池子,专门用于管理线程的创建、销毁和复用等工作。在Java程序中,线程池可以通过ThreadPoolExecutor类实…

    多线程 2023年5月17日
    00
  • Java多线程并发编程 并发三大要素

    Java多线程并发编程:并发三大要素 多线程编程本质上就是并发编程,而对于并发编程,有三个重要的要素:原子性、可见性和有序性。 原子性 原子性指的是一个操作是不可被打断的,即要么执行成功,要么执行失败,不会存在执行一半的情况。在多线程环境下,多个线程同时访问同一个变量时,可能会发生数据竞争。数据竞争常常发生在复合操作时,例如i++这样的简单操作,看似只有一行…

    多线程 2023年5月17日
    00
  • java高并发写入用户信息到数据库的几种方法

    Java是一门支持高并发的语言,数据库的写入操作也是系统中最耗时的操作之一,因此在高并发应用场景下,如何提高写入用户信息到数据库的效率成为一个不可避免的问题。下面我们来看看Java高并发写入用户信息到数据库的几种方法。 1.多线程写入数据库 多线程可以将一个大的写入任务拆分成多个小的任务,然后并发执行,提高写入速度。例如,可以用线程池来管理多个线程,每个线程…

    多线程 2023年5月17日
    00
  • 如何利用Golang写出高并发代码详解

    这里是如何利用Golang写出高并发代码的攻略: 什么是高并发 高并发是指系统在处理大量请求时,能够保持稳定性和高效性的特性。通常情况下,高并发是指单秒内能够处理数万个请求。 Golang 的 Goroutines 和 Channels 在 Golang 中,利用 goroutines 和 channels 可以轻松地编写高并发程序。 Goroutines …

    多线程 2023年5月17日
    00
  • 了解java中的Clojure如何抽象并发性和共享状态

    了解Java中的Clojure如何抽象并发性和共享状态 Clojure是一种运行在Java虚拟机上的Lisp方言,它提供了对并发编程和共享状态的高度抽象能力。 Clojure的并发编程采用的是不可变的数据结构和函数式编程,这些特性可以让编写并发程序变得更为简单和安全。 下面我们将结合示例来详细讲解Clojure如何抽象并发性和共享状态。 Clojure中的不…

    多线程 2023年5月16日
    00
  • Java 高并发十: JDK8对并发的新支持详解

    Java 高并发十: JDK8对并发的新支持详解 简介 JDK8中加入了许多新特性,对Java语言的并发编程提供了更好的支持。本文将对JDK8中新增的并发编程特性进行详细介绍。 1. CompletableFuture CompletableFuture是JDK8中新增的一个异步编程工具类,能够方便地处理多个并发任务的结果。它的主要特点包括以下几点: 支持流…

    多线程 2023年5月16日
    00
  • Java多线程之并发编程的基石CAS机制详解

    Java多线程之并发编程的基石CAS机制详解 什么是CAS CAS,即Compare And Swap,中文翻译为比较并交换。是一种无锁算法,用于实现多线程同步。在CAS操作中包含三个操作数:内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CA…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部