记录一下golang TCP UDP连接

162 阅读2分钟

服务端

package main  
  
import (  
"bufio"  
"fmt"  
"net"  
"os"  
"strings"  
)  
  
func main() {  
// 1.监听端口  
// 2.接收客户端请求建立连接  
// 3.创建goroutine处理连接  
fmt.Println("正在启动服务器,请选择连接类型")  
fmt.Println("1.启动TCP服务")  
fmt.Println("2.启动UDP服务")  
fmt.Print("请选择【1/2】:")  
inputReader := bufio.NewReader(os.Stdin)  
input, _ := inputReader.ReadString('\n')  
selectType := strings.Trim(input, "\r\n")  
if selectType == "1" {  
tcpConnect()  
}  
if selectType == "2" {  
udpConnect()  
}  
  
}  
  
func tcpConnect() {  
listen, err := net.Listen("tcp", "127.0.0.1:20000")  
if err != nil {  
fmt.Println("listen tcp failed, err:", err)  
return  
}  
fmt.Println("TCP服务已启动,地址:127.0.0.1:20000")  
for {  
conn, err := listen.Accept()  
if err != nil {  
fmt.Println("accept remote connect failed, err:", err)  
continue  
}  
go process(conn)  
}  
}  
  
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.Println("read from client failed, err:", err)  
break  
}  
recvStr := string(buf[:n])  
fmt.Println("收到client发送的数据:", recvStr)  
conn.Write([]byte("已收到"))  
}  
}  
  
func udpConnect() {  
listen, err := net.ListenUDP("udp", &net.UDPAddr{  
IP: net.IPv4(0, 0, 0, 0),  
Port: 30000,  
})  
if err != nil {  
fmt.Println("listen udp failed, err:", err)  
return  
}  
fmt.Println("UDP服务启动成功")  
defer listen.Close()  
for {  
var data [1024]byte  
n, addr, err := listen.ReadFromUDP(data[:])  
if err != nil {  
fmt.Println("read udp data failed, err:", err)  
continue  
}  
fmt.Printf("data:%v addr:%v count:%v\n", string(data[:n]), addr, n)  
_, err = listen.WriteToUDP([]byte("已成功收到"), addr) //发送数据到客户端  
if err != nil {  
fmt.Println("发送数据给客户端失败, err:", err)  
continue  
}  
}  
}

客户端

package main  
  
import (  
"bufio"  
"fmt"  
"net"  
"os"  
"strings"  
)  
  
func main() {  
// 1.建立与服务端的连接  
// 2.进行数据收发  
// 3. 关闭连接  
fmt.Println("请选择启动客户端类型")  
fmt.Println("1.TCP客户端")  
fmt.Println("2.UDP客户端")  
fmt.Print("请选择[1/2]:")  
inputReader := bufio.NewReader(os.Stdin)  
input, _ := inputReader.ReadString('\n')  
selectType := strings.Trim(input, "\r\n")  
if selectType == "1" {  
tcpClient()  
}  
if selectType == "2" {  
udpClient()  
}  
  
}  
func tcpClient() {  
conn, err := net.Dial("tcp", "127.0.0.1:20000")  
if err != nil {  
fmt.Println("err: ", err)  
return  
}  
fmt.Println("TCP客户端已启动")  
defer conn.Close()  
inputReader := bufio.NewReader(os.Stdin)  
for {  
input, _ := inputReader.ReadString('\n')  
inputInfo := strings.Trim(input, "\r\n")  
if strings.ToUpper(inputInfo) == "Q" {  
return  
}  
_, err = conn.Write([]byte(inputInfo))  
if err != nil {  
return  
}  
buf := [512]byte{}  
n, err := conn.Read(buf[:])  
if err != nil {  
fmt.Println("receive from server failed, err:", err)  
return  
}  
fmt.Println(string(buf[:n]))  
  
}  
}  
  
func udpClient() {  
socket, err := net.DialUDP("udp", nil, &net.UDPAddr{  
IP: net.IPv4(0, 0, 0, 0),  
Port: 30000,  
})  
if err != nil {  
  
}  
fmt.Println("UDP客户端已启动")  
defer socket.Close()  
fmt.Print("请输入要发送的内容:")  
inputReader := bufio.NewReader(os.Stdin)  
input, _ := inputReader.ReadString('\n')  
inputInfo := strings.Trim(input, "\r\n")  
sendData := []byte(inputInfo)  
_, err = socket.Write(sendData)  
if err != nil {  
fmt.Println("数据发送失败, err:", err)  
return  
}  
data := make([]byte, 4096)  
n, remoteAddr, err := socket.ReadFromUDP(data)  
if err != nil {  
fmt.Println("接收数据失败, err:", err)  
return  
}  
fmt.Printf("响应:%v 地址:%v 数量:%v\n", string(data[:n]), remoteAddr, n)  
}