当前位置: 代码网 > it编程>前端脚本>Golang > Go语言通过TCP协议实现聊天室功能

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

2024年05月26日 Golang 我要评论
1、服务端package main import ("fmt""net""sync") type chatserver struct {clients map[string]net.conncl

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com