golangシンプルな同時チャットルーム

1442 ワード

機能紹介:ユーザーがサービス側でテキストメッセージをブロードキャストする
goroutine使用紹介:このプログラムには4種類のgoroutineがあります.mainとbroadcasterはそれぞれgoroutineインスタンスであり、各クライアントの接続にはhandleConnとclientWriterのgoroutineがあります.
プロトコル:tcp
broadcasterのgoroutine.彼の内部変数clientsは、現在接続が確立されているクライアントのセットを記録します.その記録内容は、各クライアントのメッセージがchannelの「資格」情報を発行するものである.
broadcasterは、クライアントの到来および離脱イベントを知るために、グローバルenteringおよびleavingからのchannelを傍受する.イベントの1つを受信するとclientsセットが更新され、イベントが動作から離れるとクライアントのメッセージを閉じてchannelが発行されます.broadcasterはグローバルなメッセージchannelも傍受し、すべてのクライアントがこのchannelにメッセージを送信します.broadcasterがメッセージを受信すると、サービス側に接続されているすべてのクライアントにブロードキャストされます.
//サービス側実現
package main

import (
	"bufio"
	"fmt"
	"log"
	"net"
)

type client chan

//クライアント実装
各クライアントのgoroutine.handleConn関数は、クライアントにメッセージ発行channelを作成し、entering channelを介してクライアントの到来を通知します.その後、クライアントから送信された各ローのテキストが読み出され、グローバルなメッセージchannelによってこれらのテキストが送信され、各メッセージに送信者の接頭辞が付いてメッセージIDが表示されます.クライアントの送信が完了すると、handleConnはleavingというchannelを通じてクライアントの離脱と接続の停止を通知します.
package main

import (
	"io"
	"log"
	"net"
	"os"
)

func mustCopy(dst io.Writer, src io.Reader) {
	if _, err := io.Copy(dst, src); err != nil {
		log.Fatal(err)
	}
}

func main() {
	conn, err := net.Dial("tcp", "localhost:8000")
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	go mustCopy(os.Stdout, conn)
	mustCopy(conn, os.Stdin)
}