TCP 示例
server ( 监听 - 接收 - 发送 )
package main
// tcp 服务端: 监听 - 接收 - 发送
import (
"fmt"
"net" // 网络相关
)
// 单独处理请求的函数
func process(conn net.Conn) {
// 由于是开 goroutine 建立的请求, 函数结束前关闭
defer conn.Close()
// 从连接中接收数据
var tmp [1024]byte
n, err := conn.Read(tmp[:])
if err != nil {
fmt.Println("接收数据失败")
return
}
// 打印接收到的消息
recMsg := string(tmp[:n])
fmt.Println(recMsg)
// 发送消息
sendMsg := fmt.Sprintf("server 已经接收到如下消息: %v", recMsg)
_, err = conn.Write([]byte(sendMsg))
if err != nil {
fmt.Println("发送数据失败")
return
}
}
func main() {
// 1. 监听
l, err := net.Listen("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Printf("连接失败: port: %v\n", 20000)
return
}
// 放在这里是因为如果建立连接失败, l 不需要关闭, 直接在上方代码中 return
defer l.Close()
// 2. 接收
for {
// 通过监听, 建立连接
conn, err := l.Accept()
if err != nil {
fmt.Println("建立连接失败, err: ", err)
continue
}
// 3. 创建 goroutine 处理请求
go process(conn)
}
}
client.go ( 建立连接 - 发送 - 接收 )
package main
import (
"fmt"
"net"
)
func main() {
// 发起请求, 建立连接
conn, err := net.Dial("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Printf("建立连接失败, port: %v\n", 20000)
return
}
defer conn.Close()
// 向 server 发消息
// 发送
// 方式 1: 用 Fprintf, conn 作为句柄参数
// fmt.Fprintln(conn, "1234")
// 方式 2: 用 conn 的内置方法, 传[]byte 的类型
_, err = conn.Write([]byte("我是 client"))
if err != nil {
fmt.Println("发送消息失败")
return
}
// 接收
var tmp [1024]byte
n, err := conn.Read(tmp[:])
if err != nil {
fmt.Println("接收数据失败")
return
}
// 打印接收到的消息
fmt.Println(string(tmp[:n]))
}
UDP 示例
server ( 监听 - 接收 - 发送 )
package main
import (
"fmt"
"net"
)
func main() {
// 监听
l, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
// IP: net.IPv4(0, 0, 0, 0),
Port: 30000,
})
if err != nil {
fmt.Println("建立监听失败")
return
}
defer l.Close()
for {
// 接收
var tmp [1024]byte
n, addr, err := l.ReadFromUDP(tmp[:])
if err != nil {
fmt.Println("接收消息失败")
return
}
fmt.Printf("addr: %v; msg: %v\n", addr, string(tmp[:n]))
// 发送
msg := "server 回复 udp 消息"
_, err = l.WriteToUDP([]byte(msg), addr)
if err != nil {
fmt.Println("发送消息失败")
return
}
}
}
client ( 请求 - 发送 - 接收 )
package main
import (
"fmt"
"net"
)
func main() {
// 发起请求
conn, err := net.Dial("udp", "127.0.0.1:30000")
if err != nil {
fmt.Println("发起请求失败")
return
}
defer conn.Close()
// 发送
msg := "client 发送 udp 消息"
_, err = conn.Write([]byte(msg))
if err != nil {
fmt.Println("发送消息失败")
return
}
// 接收
var tmp [1024]byte
n, err := conn.Read(tmp[:])
if err != nil {
fmt.Println("接收消息失败")
return
}
fmt.Println(string(tmp[:n]))
}