以下是一个简单的示例,展示了如何使用Golang建立物理层网络通信:
package main
import (
"fmt"
"log"
"net"
)
func main() {
host := "127.0.0.1" // 本地主机IP地址
port := 8080 // 端口号
// 创建TCP监听器
listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", host, port))
if err != nil {
log.Fatalf("无法监听端口:%v", err)
}
defer listener.Close()
fmt.Printf("正在监听 %s:%d\n", host, port)
for {
conn, err := listener.Accept() // 接受连接请求
if err != nil {
log.Fatalf("无法接受连接:%v", err)
}
go handleConnection(conn) // 启动一个goroutine处理每个连接
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
fmt.Printf("接收到新连接: %v\n", conn.RemoteAddr())
buffer := make([]byte, 1024)
for {
n, err := conn.Read(buffer) // 从客户端读取数据
if err != nil {
log.Printf("读取错误:%v", err)
break
}
if n == 0{
break // 如果没有读取到任何数据,表示客户端已关闭连接
}
data := buffer[:n]
fmt.Printf("接收到数据:%s\n", string(data))
response := []byte("已收到你的消息")
_,err = conn.Write(response) // 发送响应给客户端
if err != nil{
log.Printf("写入错误:%v",err)
break
}
}
}
这个示例使用net包创建了一个TCP监听器,通过指定本地主机IP地址和端口号进行监听。然后,每当有新的连接请求时,会启动一个goroutine来处理该连接。在处理连接的goroutine中,它会不断从客户端读取数据,并将收到的数据打印出来。然后,它会向客户端发送一个响应消息。如果发生任何错误或客户端关闭连接,循环将退出。
请注意,这只是一个简单示例,并未考虑错误处理、并发性能优化以及其他更复杂的网络通信场景。在实际开发中,您可能需要根据具体需求对代码进行修改和扩展。
内容由零声教学AI助手提供,问题来源于学员提问