13.网络编程
实现TCP通信
懵逼树上懵逼果,懵逼树下你和我
TCP客户端
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
// 与服务端建立连接
conn, err := net.Dial("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
// 使用连接进行数据的发送和接收
input := bufio.NewReader(os.Stdin)
for {
s, _ := input.ReadString('\n')
s = strings.TrimSpace(s)
if strings.ToUpper(s) == "Q" {
return
}
// 给服务端发消息
_, err := conn.Write([]byte(s))
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
// 从服务端接收回复的消息
var buf [1024]byte
n, err := conn.Read(buf[:])
if err != nil {
fmt.Printf("reead失败err: %v\n", err)
return
}
fmt.Println("收到服务端回复:", string(buf[:n]))
}
}
TCP服务端
package main
import (
"bufio"
"fmt"
"net"
)
func process(conn net.Conn) {
defer conn.Close() // 处理完成以后要关闭这个连接
for {
reader := bufio.NewReader(conn)
var buf [128]byte
n, err := reader.Read(buf[:])
if err != nil {
fmt.Printf("err: %v\n", err)
break
}
recv := string(buf[:n])
fmt.Printf("接收到的数据recv: %v\n", recv)
conn.Write([]byte("ok")) // 把收到的数据返回
}
}
func main() {
// 开启监听服务
listen, err := net.Listen("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
for {
// 等待客户端连接
conn, err := listen.Accept()
if err != nil {
fmt.Printf("err: %v\n", err)
continue
}
// 启动一个单独的goroutine去处理连接
go process(conn)
}
}
UDP通讯
UDP服务端
package main
import (
"fmt"
"net"
)
func main() {
listen, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 30000,
})
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
defer listen.Close()
for {
var buf [1024]byte
n, addr, err := listen.ReadFromUDP(buf[:])
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println("接收到的数据:", string(buf[:n]))
_, er := listen.WriteToUDP(buf[:n], addr)
if er != nil {
fmt.Printf("err: %v\n", er)
return
}
}
}
UDP客户端
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
c, err := net.DialUDP("udp", nil, &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 30000,
})
if err != nil {
fmt.Printf("err: %v\n", err)
}
defer c.Close()
input := bufio.NewReader(os.Stdin)
for {
s, _ := input.ReadString('\n')
_, err = c.Write([]byte(s))
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
// 接收数据
var buf [1024]byte
n, addr, err := c.ReadFromUDP(buf[:])
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Printf("从%v,读取:%v\n", addr, buf[:n])
}
}