Go 实现一个简单的聊天室

本文介绍了如何使用Go语言实现一个简单的聊天室,包括创建客户端、监听呼叫、接收和发送消息、修改昵称、查询在线用户、用户退出与超时强退以及私聊功能。通过netcat工具进行测试,展示了Go语言在构建网络应用中的基本用法。
摘要由CSDN通过智能技术生成

创建客户端

先在main方法中创建一个sorcket服务端,这个服务端就像一个酒店

func main() {
   
	listen, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil {
   
		fmt.Println("listen err", err)
		return
	}
	defer listen.Close()
}

监听呼叫

之后就要开始监听下一个客户端的呼叫,也就是等待下一位客人
Accept方法会等待下一个呼叫,并返回一个该呼叫的Conn接口。这时便拿到了客人的信息

func main() {
   
	// 创建服务端
	listen, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil {
   
		fmt.Println("listen err", err)
		return
	}
	defer listen.Close()
	
	// 等待客户端呼叫
	for {
   
		conn, err := listen.Accept()
		if err != nil {
   
			fmt.Println("accept err", err)
			return
		}
	}
}

创建客户端

创建客户端结构体, 每个服务端是一个用户

type Client struct{
   
	c chan string // 消息接受管道
	Name string   // 昵称
	Addr string	  // ip与端口
}

收到呼叫拿到conn后,就需要为这个conn来创建一个协程
也就是得到客人的信息后,专门派一个服务员只为该客户服务

func main() {
   
	// 创建服务端
	listen, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil {
   
		fmt.Println("listen err", err)
		return
	}
	defer listen.Close()
	
	go Manager() // 这个暂时忽略掉,下面有
	
	// 等待客户端呼叫
	for {
   
		conn, err := listen.Accept()
		if err != nil {
   
			fmt.Println("accept err", err)
			return
		}
		go HandleConnect(conn) // 这里加了一句代码,启动一个go协程来为conn服务
	}
}

服务员要干的第一件是就是带客户到房间,也就是为这个conn创建一个Client,并将其放进在线用户Map,netAddr是网络地址,以网络地址为键,client为值

全局变量 在线用户map

var onlineUsersMap map[string]*Client

到这里就出现问题了,那在线用户map在哪里初始化使用啊?

我们创建一个专门来管理在线用户与消息群发的管理方法,这里暂时先初始化在线用户

func Manager(){
   
	// 初始化一下在线用户map
	onlineUsersMap = make(map[string]*Client)
}

初始化一定要在赋值前,因此Manager协程一定要在HandleConnect前启动,现在翻到上面的main方法中,看一下位置

func HandleConnect(conn net.Conn
  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
首先,我们需要了解两个概念:客户端和服务器端。客户端是指用户使用的设备,如电脑、手机等;服务器端是指提供服务的计算机,如网站、聊天室等。 在本例中,我们需要用到以下技术:HTML、CSS、JavaScript 和 Go 语言。其中,HTML、CSS 和 JavaScript 用于开发客户端,Go 语言用于开发服务器端。 以下是一个简单聊天室实现步骤: 1. 创建 HTML 页面,包括聊天室界面和发送消息的表单。 ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Chat Room</title> <style> /* 样式表 */ </style> </head> <body> <div id="chatroom"> <!-- 聊天室界面 --> </div> <form id="message-form"> <input type="text" id="message-input"> <button type="submit">Send</button> </form> <script src="chatroom.js"></script> </body> </html> ``` 2. 创建 CSS 样式表。 ```css /* 样式表 */ ``` 3. 创建 JavaScript 文件 chatroom.js,实现客户端与服务器端通信和消息显示功能。 ```javascript // 创建 WebSocket 连接 const ws = new WebSocket("ws://localhost:8000/ws"); // 监听连接事件 ws.addEventListener("open", event => { console.log("Connected to server"); }); // 监听消息事件 ws.addEventListener("message", event => { const message = event.data; // 在聊天室界面中显示消息 }); // 监听表单提交事件 const form = document.getElementById("message-form"); form.addEventListener("submit", event => { event.preventDefault(); // 阻止表单提交 const input = document.getElementById("message-input"); const message = input.value; input.value = ""; // 清空输入框 // 发送消息到服务器 ws.send(message); }); ``` 4. 创建 Go 语言服务器端,实现 WebSocket 连接和消息转发功能。 ```go package main import ( "fmt" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func main() { http.HandleFunc("/ws", handleWebSocket) http.ListenAndServe(":8000", nil) } func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { fmt.Println(err) return } defer conn.Close() for { // 接收消息 _, message, err := conn.ReadMessage() if err != nil { fmt.Println(err) break } // 转发消息到所有客户端 for _, c := range clients { err = c.WriteMessage(websocket.TextMessage, message) if err != nil { fmt.Println(err) break } } } } ``` 以上就是一个简单聊天室实现步骤。需要注意的是,本例中的服务器端只是一个简单的示例,实际应用中需要考虑更多的安全性和可靠性问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值