课程名称:(打造简历金牌项目)Vue+Go 开发企业级微服务网关项目
课程章节:2-9 2-10
课程讲师:牛儿吃草
课程内容:
GoLang创建udp的客户端和服务端
UDP Client
package main
import (
"fmt"
"net"
)
func main() {
//step 1 连接服务器
conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 9090,
})
if err != nil {
fmt.Printf("connect failed, err: %v\n", err)
return
}
for i := 0; i < 100; i++ {
//step 2 发送数据
_, err = conn.Write([]byte("hello server!"))
if err != nil {
fmt.Printf("send data failed, err : %v\n", err)
return
}
//step 3 接收数据
result := make([]byte, 1024)
n, remoteAddr, err := conn.ReadFromUDP(result)
if err != nil {
fmt.Printf("receive data failed, err: %v\n", err)
return
}
fmt.Printf("receive from addr: %v data: %v\n", remoteAddr, string(result[:n]))
}
}
UDP Server
package main
import (
"fmt"
"net"
)
func main() {
//step 1 监听服务器
listen, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0),
Port: 9090,
})
if err != nil {
fmt.Printf("listen failed, err:%v\n", err)
return
}
//step 2 循环读取消息内容
for {
var data [1024]byte
n, addr, err := listen.ReadFromUDP(data[:])
if err != nil {
fmt.Printf("read failed from addr: %v, err: %v\n", addr, err)
break
}
go func() {
//todo sth
//step 3 回复数据
fmt.Printf("addr: %v data: %v count: %v\n", addr, string(data[:n]), n)
_, err = listen.WriteToUDP([]byte("received success!"), addr)
if err != nil {
fmt.Printf("write failed, err: %v\n", err)
}
}()
}
}
创建TCP 客户端和服务端
tcpclient
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
doSend()
fmt.Print("doSend over")
doSend()
fmt.Print("doSend over")
//select {}
}
func doSend() {
//1、连接服务器
conn, err := net.Dial("tcp", "localhost:9090")
if err != nil {
fmt.Printf("connect failed, err : %v\n", err.Error())
return
}
defer conn.Close() //思考题:这里不填写会有啥问题?
//2、读取命令行输入
inputReader := bufio.NewReader(os.Stdin)
for {
// 3、一直读取直到读到\n
input, err := inputReader.ReadString('\n')
if err != nil {
fmt.Printf("read from console failed, err: %v\n", err)
break
}
// 4、读取Q时停止
trimmedInput := strings.TrimSpace(input)
if trimmedInput == "Q" {
break
}
// 5、回复服务器信息
_, err = conn.Write([]byte(trimmedInput))
if err != nil {
fmt.Printf("write failed , err : %v\n", err)
break
}
}
}
tcpserver
package main
import (
"fmt"
"net"
)
func main() {
//1、监听端口
listener, err := net.Listen("tcp", "0.0.0.0:9090")
if err != nil {
fmt.Printf("listen fail, err: %v\n", err)
return
}
//2.建立套接字连接
for {
conn, err := listener.Accept()
if err != nil {
fmt.Printf("accept fail, err: %v\n", err)
continue
}
//3. 创建处理协程
go process(conn)
}
}
func process(conn net.Conn) {
defer conn.Close() //思考题:这里不填写会有啥问题?
for {
var buf [128]byte
n, err := conn.Read(buf[:])
if err != nil {
fmt.Printf("read from connect failed, err: %v\n", err)
break
}
str := string(buf[:n])
fmt.Printf("receive from client, data: %v\n", str)
}
}
课程收获:
- 通过前一阶段udp和tcp相关理论的学习,以及今天的udp客户端,服务端、tcp客户端,服务端的代码实现,终于将之前所学理论和实际操作相结合。