2017-09-25 11 views
3

私はgolangで1対1のチャットをしたいと思います。私はこの簡単なスクリプトをwebsocketで見つけています。それは本当にうまく動作しています。しかし、私はそれがより多くの接続を使用したり、ユーザーをフィルタリングする必要があるかわからないので、誰かが助けることができる場合は、これはスクリプトですFacebookのようなものに1つに変換したい。ゴラン1対1のチャット

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 
+0

これを解決できましたか?私も同じことに取り組んでいて、助言が必要です –

答えて

4

を変更必要があるのです:

  1. broadcastチャネルどういうわけか
  2. を取り除く渡す&へのリクエストから取得あなたのユーザーが接続したいクライアント。部屋番号/名前、秘密のコード?例えば、URLパラメータ/ws?chat=abcmap[chatid][]*websocket.Conn
  3. マッチ2(以上)のクライアントを維持する必要があります。
  4. おそらくタイプがmap[*websocket.Conn]*websocket.Conn
  5. のマップを維持します。クライアントからメッセージを受信すると、そのマップを検索し、一致するクライアントにメッセージを送信します。 handleMessages()と同様の方法ですが、1回だけです。

注意StackOverflowはコードを書くように要求する場所ではありません。

関連する問題