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实现聊天室内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言中的空值(nil)与零值(zerovalue)区别详解

    Go语言中的空值(nil)与零值(zerovalue)区别详解

    在Go语言中,空值(nil)和零值(zero value)是两个不同的概念,它们在语义、使用场景以及实际的编程实践中有着明显的区别,理解这两者的差异对于编写清晰、健壮的Go代码至关重要,需要的朋友可以参考下
    2024-06-06
  • GO语言包管理工具go mod以及包详解

    GO语言包管理工具go mod以及包详解

    go mod是go的一个模块管理工具,用来代替传统的GOPATH方案,下面这篇文章主要给大家介绍了关于GO语言包管理工具go mod以及包详解的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • GoLang中生成UUID唯一标识的实现

    GoLang中生成UUID唯一标识的实现

    这篇文章主要介绍了GoLang中生成UUID唯一标识的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • go语言LeetCode题解944删列造序示例详解

    go语言LeetCode题解944删列造序示例详解

    这篇文章主要为大家介绍了go语言LeetCode题解944删列造序示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • go 指针接收者和值接收者的区别小结

    go 指针接收者和值接收者的区别小结

    在Go 语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go 指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Go语言基础知识点介绍

    Go语言基础知识点介绍

    在本篇文章里小编给大家整理的是一篇关于Go语言基础知识点介绍内容,有兴趣的朋友们可以跟着学习参考下。
    2021-07-07
  • 使用Go HTTP客户端打造高性能服务

    使用Go HTTP客户端打造高性能服务

    大多数语言都有提供各自的 HTTP 客户端,本文将动手实践如何使用Go语言发起HTTP请求,并讨论其中有可能遇到的问题。具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • golang中defer的使用规则详解

    golang中defer的使用规则详解

    大家应该都知道在golang当中,defer代码块会在函数调用链表中增加一个函数调用。下面这篇文章主要给大家介绍了关于golang中defer的使用规则,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-07-07
  • Go基础教程之环境搭建及常用命令

    Go基础教程之环境搭建及常用命令

    这篇文章主要介绍了Go基础教程之环境搭建及常用命令的相关资料,包括Go语言简介、环境配置、包管理工具GoModules以及常用命令的全面介绍,需要的朋友可以参考下
    2025-03-03
  • 使用Golang Validator包实现数据验证详解

    使用Golang Validator包实现数据验证详解

    在开发过程中,数据验证是一个非常重要的环节,而golang中的Validator包是一个非常常用和强大的数据验证工具,提供了简单易用的API和丰富的验证规则,下面我们就来看看Validator包的具体使用吧
    2023-12-12

最新评论