脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - Go语言通过TCP协议实现聊天室功能

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

2024-04-23 16:23谷隐凡二 Golang

这篇文章主要为大家详细介绍了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语言通过TCP协议实现聊天室功能的文章就介绍到这了,更多相关Go TCP实现聊天室内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_37570494/article/details/138084333

延伸 · 阅读

精彩推荐
  • Golanggolang实现微信支付v3版本的方法

    golang实现微信支付v3版本的方法

    这篇文章主要介绍了golang实现微信支付v3版本的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    Go语言中文网14052021-03-31
  • Golang利用Go传统RPC和gRPC框架分别实现一个RPC服务端

    利用Go传统RPC和gRPC框架分别实现一个RPC服务端

    RPC(Remote Procedure Call, 远程过程调用) 是一种计算机通信协议, 它允许程序调用另一个地址空间(通常是远程机器上的)的过程或函数, 就像本地调用一样, 而不需...

    二进制空间安全8572024-01-02
  • Golanggolang并发工具MapReduce降低服务响应时间

    golang并发工具MapReduce降低服务响应时间

    这篇文章主要为大家介绍了golang并发使用MapReduce降低服务响应时间实践使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早...

    zhoushuguang5492022-09-29
  • Golang使用Golang实现加权负载均衡算法的实现代码

    使用Golang实现加权负载均衡算法的实现代码

    这篇文章主要介绍了使用Golang实现加权负载均衡算法的实现代码,详细说明权重转发算法的实现,通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    Mr.YF6212021-09-19
  • GolangGolang中的参数传递示例详解

    Golang中的参数传递示例详解

    参数传递是指在程序的传递过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程,下面这篇文章主要给大家介...

    tomorrowwu5082020-05-08
  • GolangGo语言基础if条件语句用法及示例详解

    Go语言基础if条件语句用法及示例详解

    这篇文章主要为大家介绍了Go语言基础if条件语句的用法及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪...

    枫少文4852021-12-07
  • Golanggolang中interface接口的深度解析

    golang中interface接口的深度解析

    什么是interface,简单的说,interface是一组method的组合,下面这篇文章主要给大家深度解析了关于golang中的interface接口,文中通过示例代码介绍的非常详细,...

    D_Guco5162020-05-11
  • Golang如何使用Goland IDE go mod 方式构建项目

    如何使用Goland IDE go mod 方式构建项目

    这篇文章主要介绍了如何使用Goland IDE go mod 方式构建项目,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考...

    AmbroseRen8312021-01-26