ZBLOG

golang websocket 实现简单im

好的,以下是一个简单的 Golang WebSocket 实现的 IM:

package main

import (
	"fmt"
	"log"
	"net/http"

	"github.com/gorilla/websocket"
)

type Message struct {
	Username string `json:"username"`
	Message  string `json:"message"`
}

var clients = make(map[*websocket.Conn]bool) // 已连接客户端列表
var broadcast = make(chan Message)           // 广播通道

var upgrader = websocket.Upgrader{} // 使用默认设置升级为WebSocket

func handleConnections(w http.ResponseWriter, r *http.Request) {
	// 升级HTTP连接为WebSocket连接
	ws, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Fatal(err)
	}
	defer ws.Close()

	// 将新客户端添加到已连接客户端列表中
	clients[ws] = true

	for {
		var msg Message
		err := ws.ReadJSON(&msg)
		if err != nil { // 如果读取错误,则表示客户端断开了连接,将其从已连接客户端列表中删除并关闭其WebSocket连接。
			delete(clients, ws)
			fmt.Println("Client Disconnected!")
			break
		}
		
        // 将接收到的消息广播给所有已连接客户端。
        broadcast <- msg
    }
}

func handleMessages() {
	for {
        // 从广播通道读取消息,并将其发送给所有已连接客户端。
        msg := <-broadcast
        for client := range clients {
            err := client.WriteJSON(msg)
            if err != nil { // 如果写入错误,则表示该客户端断开了连接,将其从已连接客户端列表中删除并关闭其WebSocket连接。
                delete(clients, client)
                fmt.Println("Client Disconnected!")
                break
            }
        }
    }
}

func main() {
	// 静态文件服务器
	fs := http.FileServer(http.Dir("./public"))
	http.Handle("/", fs)

	// 用于处理WebSocket连接的路由器
	http.HandleFunc("/ws", handleConnections)

	// 启动一个协程来处理所有广播消息
	go handleMessages()

	fmt.Println("Server Started!")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal(err)
	}
}

以上代码使用了 Gorilla WebSocket 库,该库提供了易于使用的API,使得创建和管理WebSocket变得简单。在这个例子中,我们维护一个已连接客户端的列表,并使用一个goroutine来广播每条接收到的消息给所有已连接的客户端。

同时还需要创建一个简单的 HTML 页面作为 IM 的客户端界面(位于 public/index.html),以下是代码:

<!DOCTYPE html>
<html>

<head>
    <title>Simple IM</title>
</head>

<body>
    <h1>Simple IM</h1>
    <div id="messages"></div>
    <input type="text" id="username" placeholder="Username"><br />
    <input type="text" id="message" placeholder="Message"><br />
    <button onclick="send()">Send</button>

    <script>
        var socket = new WebSocket("ws://" + window.location.host + "/ws");

        // 在页面上显示新消息。
        socket.onmessage = function (event) {
            var msg = JSON.parse(event.data);
            var messages = document.getElementById("messages");
            messages.innerHTML += msg.username + ": " + msg.message + "<br />";
        };

        // 当单击“发送”按钮时,将用户名和消息发送到服务器。
        function send() {
            var username = document.getElementById("username").value;
            var message = document.getElementById("message").value;
            socket.send(JSON.stringify({
                username: username,
                message: message
            }));
        }
    </script>
</body>

</html>

以上 HTML 页面使用 JavaScript 创建 WebSocket 连接,并在接收到新消息时在页面上显示它。同时还有一个简单的表单,用于输入用户名和消息,并通过 WebSocket 连接将其发送到服务器。

希望这个示例能对你有所帮助!

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=2864

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?