好的,以下是一个简单的 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 连接将其发送到服务器。
希望这个示例能对你有所帮助!




