Go语言通过TCP协议实现聊天室功能

 更新时间:2024年04月23日 10:40:20   作者:谷隐凡二  
这篇文章主要为大家详细介绍了Go语言中如何通过TCP协议实现聊天室功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

1、服务端

package main
 
import (
	"fmt"
	"net"
	"sync"
)
 
type ChatServer struct {
	clients    map[string]net.Conn
	clientsMux sync.Mutex
}
 
func NewChatServer() *ChatServer {
	return &ChatServer{
		clients: make(map[string]net.Conn),
	}
}
 
func (s *ChatServer) broadcast(message string, sender string) {
	s.clientsMux.Lock()
	defer s.clientsMux.Unlock()
 
	for clientAddr, conn := range s.clients {
		if clientAddr != sender {
			fmt.Fprintf(conn, "[%s]: %s\n", sender, message)
		}
	}
}
 
func (s *ChatServer) handleConnection(conn net.Conn) {
	defer conn.Close()
 
	clientAddr := conn.RemoteAddr().String()
 
	fmt.Printf("New connection from %s\n", clientAddr)
 
	s.clientsMux.Lock()
	s.clients[clientAddr] = conn
	s.clientsMux.Unlock()
 
	for {
		buffer := make([]byte, 1024)
		n, err := conn.Read(buffer)
		if err != nil {
			fmt.Printf("Error reading from %s: %v\n", clientAddr, err)
			break
		}
 
		message := string(buffer[:n])
		fmt.Printf("[%s]: %s\n", clientAddr, message)
 
		s.broadcast(message, clientAddr)
	}
}
 
func main() {
	server := NewChatServer()
 
	listener, err := net.Listen("tcp", ":8080")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	defer listener.Close()
 
	fmt.Println("TCP chat server listening on :8080")
 
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Error accepting connection:", err)
			continue
		}
		go server.handleConnection(conn)
	}
}

2、客户端

package main
 
import (
	"bufio"
	"fmt"
	"net"
	"os"
)
 
func readMessages(conn net.Conn) {
	reader := bufio.NewReader(conn)
	for {
		message, err := reader.ReadString('\n')
		if err != nil {
			fmt.Println("Error reading message:", err)
			break
		}
		fmt.Print(message)
	}
}
 
func main() {
	conn, err := net.Dial("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("Error connecting to server:", err)
		return
	}
	defer conn.Close()
 
	go readMessages(conn)
 
	for {
		scanner := bufio.NewScanner(os.Stdin)
		scanner.Scan()
		message := scanner.Text()
 
		_, err := conn.Write([]byte(message + "\n"))
		if err != nil {
			fmt.Println("Error sending message:", err)
			break
		}
	}
}

3、实现效果

到此这篇关于Go语言通过TCP协议实现聊天室功能的文章就介绍到这了,更多相关Go TCP实现聊天室内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang中连接mysql数据库

    golang中连接mysql数据库

    这篇文章主要介绍了golang中连接mysql数据库的步骤,帮助大家更好的理解和学习go语言,感兴趣的朋友可以了解下
    2020-12-12
  • Golang标准库time包日常用法小结

    Golang标准库time包日常用法小结

    本文主要介绍了Golang标准库time包日常用法小结,可以通过它们来获取当前时间、创建指定时间、解析时间字符串、控制时间间隔等操作,感兴趣的可以了解一下
    2023-11-11
  • 使用Golang实现对网络数据包的捕获与分析

    使用Golang实现对网络数据包的捕获与分析

    在网络通信中,网络数据包是信息传递的基本单位,抓包是一种监控和分析网络流量的方法,用于获取网络数据包并对其进行分析,本文将介绍如何使用Golang实现抓包功能,包括网络数据包捕获和数据包分析,需要的朋友可以参考下
    2023-11-11
  • 读取Go项目中的配置文件的方法

    读取Go项目中的配置文件的方法

    本文主要介绍了读取Go项目中的配置文件的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Go Context库 使用基本示例

    Go Context库 使用基本示例

    在Go的http包中,每个请求由独立的goroutine处理,这些goroutine可能需要访问请求特定的数据或启动其他服务,Context在Go语言中提供了一种方式来传递请求域的数据、取消信号和截止时间,本文介绍Go Context库 使用基本示例,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • 详解Golang中创建error的方式总结与应用场景

    详解Golang中创建error的方式总结与应用场景

    Golang中创建error的方式包括errors.New、fmt.Errorf、自定义实现了error接口的类型等,本文主要为大家介绍了这些方式的具体应用场景,需要的可以参考一下
    2023-07-07
  • Go语言中你所不知道的位操作用法

    Go语言中你所不知道的位操作用法

    位运算可能在平常的编程中使用的并不多,但涉及到底层优化,一些算法及源码可能会经常遇见。下面这篇文章主要给大家介绍了关于Go语言中你所不知道的位操作用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-12-12
  • 深入浅出Go:掌握基础知识的关键要点

    深入浅出Go:掌握基础知识的关键要点

    Go是一种开源的编程语言,由Google开发,它具有简洁、高效、并发性强的特点,适用于构建可靠的、高性能的软件系统,本文将介绍Go的基础知识,需要的朋友可以参考下
    2023-10-10
  • go实现冒泡排序算法

    go实现冒泡排序算法

    冒泡排序算法是数据结构中常用的一种算法,本文就介绍了go实现冒泡排序算法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 一文带你了解Go语言中的指针和结构体

    一文带你了解Go语言中的指针和结构体

    前面的两篇文章对 Go 语言的基础语法和基本数据类型以及几个复合数据类型进行介绍,本文将对 Go 里面的指针和结构体进行介绍,也为后续文章做铺垫,感兴趣的可以了解一下
    2022-11-11

最新评论