package main import ( "bufio" "fmt" "net" "os" "strings" ) func main() { arguments := os.Args if len(arguments) == 1 { fmt.Println("请提供一个端口号") // 没有提供端口号,输出提示信息 return } PORT := ":" + arguments[1] // 读取端口号 l, err := net.Listen("tcp4", PORT) // 监听指定端口 if err != nil { fmt.Println(err) return } defer l.Close() fmt.Println("正在监听端口" + PORT) for { conn, err := l.Accept() // 接受新的连接 if err != nil { fmt.Println(err) continue } go handleConnection(conn) // 使用 goroutine 处理连接 } } func handleConnection(conn net.Conn) { fmt.Println("新的客户端已连接:", conn.RemoteAddr().String()) // 输出连接信息 scanner := bufio.NewScanner(conn) // 创建一个扫描器,从连接中读取数据 for { ok := scanner.Scan() // 扫描器读取一行数据 if !ok { // 读取失败,退出循环 break } message := scanner.Text() // 获取读取到的数据 if strings.TrimSpace(message) == "STOP" { // 如果是 STOP 命令,退出循环 break } fmt.Println("收到消息:", message) // 输出接收到的消息 go broadcastMessage(conn, message) // 广播消息到所有连接中 } fmt.Println("客户端已断开连接:", conn.RemoteAddr().String()) // 输出连接信息 conn.Close() // 关闭连接 } func broadcastMessage(sender net.Conn, message string) { for _, conn := range getAllConnections() { // 获取所有连接 if conn != sender { // 除了发送者之外的其他连接 fmt.Fprintln(conn, message) // 发送消息 } } } func getAllConnections() []net.Conn { connections := make([]net.Conn, 0) // 创建连接数组 // TODO: 实现获取所有连接的逻辑 return connections }
这个例子创建了一个简单的 P2P 网络,监听指定的端口号。一旦有新的连接,它会接受连接并处理它。对于每个连接,它将启动一个新的 goroutine 来处理消息,并将消息广播到所有其他连接中。每个连接都有一个单独的 goroutine 处理它。可以通过运行多个实例来测试这个程序,并使用不同的端口号连接到它们。