go tcp多重化の問題の対処法
Goでは、netパッケージが提供するnet.Listen関数とnet.Accept関数を使ってTCP多重化を実現できます。以下に簡単なコードサンプルを示します。
package main
import (
"fmt"
"net"
"os"
)
func main() {
listener, err := net.Listen("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("Error listening:", err.Error())
os.Exit(1)
}
defer listener.Close()
fmt.Println("Listening on 127.0.0.1:8080")
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting:", err.Error())
os.Exit(1)
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
buffer := make([]byte, 1024)
for {
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("Error reading:", err.Error())
return
}
fmt.Println("Received message:", string(buffer[:n]))
_, err = conn.Write([]byte("Message received"))
if err != nil {
fmt.Println("Error writing:", err.Error())
return
}
}
}
この例では、net.Listen関数を使用して指定されたTCPアドレスでリスニングし、net.Accept関数を使用してクライアントからの接続を受け入れます。handleConnection関数は各クライアントからの接続を処理するために使用でき、ここで具体的なビジネスロジックを実行できます。goキーワードを使用して各接続の処理を独立したgoroutineに配置することで、マルチプレクシングを実現できます。
以上のサンプルは単なる簡単なデモンストレーションです。実際には、select ステートメントを使用して同時に複数の接続を処理したり、sync.WaitGroup を使用してすべての接続の処理が完了するまで待機したりするなど、より複雑な処理ロジックが必要になる可能性があります。具体的な処理方法は、実際のニーズによって異なります。