加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang一对一聊天

发布时间:2020-12-16 09:24:55 所属栏目:大数据 来源:网络整理
导读:我想在golang上进行一对一的聊天,我发现这个简单的脚本与websocket它工作得很好,它是一个房间,你想要多少用户.但是我希望将它转换为一对一,就像facebook一样,这是脚本,如果有人可以提供帮助,因为我不知道我需要使用更多连接或过滤用户. package mainimport (
我想在golang上进行一对一的聊天,我发现这个简单的脚本与websocket它工作得很好,它是一个房间,你想要多少用户.但是我希望将它转换为一对一,就像facebook一样,这是脚本,如果有人可以提供帮助,因为我不知道我需要使用更多连接或过滤用户.

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var clients = make(map[*websocket.Conn]bool) // connected clients
var broadcast = make(chan Message)           // broadcast channel

// Configure the upgrader
var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },}

// Define our message object
type Message struct {
    Email    string `json:"email"`
    Username string `json:"username"`
    Message  string `json:"message"`
    Created  string `json:"created"`
}

func main() {
    // Create a simple file server
    fs := http.FileServer(http.Dir("public"))
    http.Handle("/",fs)

    // Configure websocket route
    http.HandleFunc("/ws",handleConnections)

    // Start listening for incoming chat messages
    go handleMessages()

    // Start the server on localhost port 8000 and log any errors
    log.Println("http server started on :8090")
    err := http.ListenAndServe(":8090",nil)
    if err != nil {
        log.Fatal("ListenAndServe: ",err)
    }
}

func handleConnections(w http.ResponseWriter,r *http.Request) {
    // Upgrade initial GET request to a websocket
    ws,err := upgrader.Upgrade(w,r,nil)
    if err != nil {
        log.Fatal(err)
    }
    // Make sure we close the connection when the function returns
    defer ws.Close()

    // Register our new client
    clients[ws] = true

    for {
        var msg Message
        // Read in a new message as JSON and map it to a Message object
        err := ws.ReadJSON(&msg)
        if err != nil {
            log.Printf("error: %v",err)
            delete(clients,ws)
            break
        }
        // Send the newly received message to the broadcast channel
        broadcast <- msg
    }
}

func handleMessages() {
    for {
        // Grab the next message from the broadcast channel
        msg := <-broadcast
        // Send it out to every client that is currently connected
        for client := range clients {
            err := client.WriteJSON(msg)
            if err != nil {
                log.Printf("error: %v",err)
                client.Close()
                delete(clients,client)
            }
        }
    }
}

我需要改变这一部分

clients[ws] = true

解决方法

你需要做几件事:

>摆脱广播频道
>以某种方式通过&从请求获取您的用户想要连接的客户端.一些房间号/姓名,密码?例如,URL参数/ ws?chat = abc.您可能需要维护一个地图[chatid] [] * websocket.Conn
>匹配2个(或更多)客户端.
>维护一张地图,可能是类型map [* websocket.Conn] * websocket.Conn
>从客户端收到消息后,查找地图并将消息发送给匹配的客户端.以与handleMessages()类似的方式,但只有一次.

请注意StackOverflow不是要求为您编写代码的地方.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读