今回は、接続してきたクライアントの順番(何人目の接続か)を追跡する機能を追加してみます。
これにより、各クライアントに「あなたは○○人目の接続者です」といったメッセージを送信できます。
実装の変更点
- 接続者数を管理するために、サーバー側でカウンターを設置します。
- 各クライアントが接続した際に、その順番を送信します。
以下はtelnet電子広告サーバーの基本的なコード例です:
package main
import (
"fmt"
"net"
"sync"
"time"
)
var connectionCount int
var mu sync.Mutex // 同時アクセスを防ぐためのミューテックス
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error starting server:", err)
return
}
defer listener.Close()
fmt.Println("Server started on port 8080")
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Connection error:", err)
continue
}
// 接続順番を追跡
mu.Lock()
connectionCount++
clientNumber := connectionCount
mu.Unlock()
go handleConnection(conn, clientNumber)
}
}
func handleConnection(conn net.Conn, clientNumber int) {
defer conn.Close()
// 接続順番を伝えるメッセージ
welcomeMessage := fmt.Sprintf("あなたは%d人目の接続者です!\n", clientNumber)
conn.Write([]byte(welcomeMessage))
messages := []string{
"Profile:",
"MailAdress",
}
for {
for _, msg := range messages {
conn.Write([]byte(msg + "\n"))
time.Sleep(5 * time.Second)
}
}
}
変更点の説明
-
connectionCount
:接続してきたクライアントの順番を追跡するために、グローバル変数としてカウントします。 -
mu
(ミューテックス):複数の接続が並行して進行するため、connectionCount
へのアクセスを同期させるためにミューテックスを使っています。 -
clientNumber
:接続順番をカウントして、各クライアントにその情報を送信します。
実行方法
- 上記のコードを
main.go
という名前で保存します。 - 以下のコマンドを実行してサーバーを起動します:
go run main.go
- 別のターミナルで以下のコマンドを使用してtelnetクライアントを起動します:
telnet localhost 8080
- クライアントに「あなたは○○人目の接続者です!」というメッセージが表示され、その後、広告が定期的に表示されることを確認してください。