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 处理它。可以通过运行多个实例来测试这个程序,并使用不同的端口号连接到它们。

