基于TCP协议的传输
//server端
package main
//tcp server端
import (
"fmt"
"net"
)
func processConn(conn net.Conn) {
//3.与客户端通信
var tmp [128]byte
for {
n, err := conn.Read(tmp[:])
if err != nil {
fmt.Println("read from conn failed,err:", err)
return
}
fmt.Println(string(tmp[:n]))
}
}
func main() {
//1.本地端口启动服务
listener, err := net.Listen("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Println("start server on 127.0.0.1:20000 failed err:", err)
return
}
//2.等待别人来跟我建立连接
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("accept failed,err:", err)
return
}
go processConn(conn)
}
}
//client端
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
//tcp client
func main() {
//1.与server端建立连接
conn, err := net.Dial("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Println("dial 127.0.0.1:20000 failed,err:", err)
return
}
//2.发送数据
var msg string
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("请说话:")
msg, _ = reader.ReadString('\n')
msg = strings.TrimSpace(msg)
if msg == "exit" {
break
}
conn.Write([]byte(msg))
}
conn.Close()
}
//TCP粘包
//server端一次收到多个client端发送来的数据
//需要对发送的数据进行编码和解码
package main
//tcp server端
import (
"bufio"
"fmt"
"io"
"net"
)
func processConn(conn net.Conn) {
defer conn.Close()
reader := bufio.NewReader(conn)
//3.与客户端通信
var tmp [1024]byte
for {
n, err := reader.Read(tmp[:])
if err == io.EOF {
break
}
if err != nil {
fmt.Println("read from conn failed,err:", err)
break
}
recvStr := string(tmp[:n])
fmt.Println("收到client发来的数据:", recvStr)
}
}
func main() {
//1.本地端口启动服务
listener, err := net.Listen("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Println("start server on 127.0.0.1:20000 failed err:", err)
return
}
defer listener.Close()
//2.等待别人来跟我建立连接
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("accept failed,err:", err)
return
}
go processConn(conn)
}
}
package main
import (
"fmt"
"net"
)
//粘包client
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Println("dial failed,err", err)
return
}
defer conn.Close()
for i := 0; i < 20; i++ {
msg := `Hello, Hello. How are you?`
//为了不粘包,调用协议编码数据
conn.Write([]byte(msg))
}
}
基于UDP协议的传输
//server
package main
import (
"fmt"
"net"
"strings"
)
//UDP server端
func main() {
conn, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 40000,
})
if err != nil {
fmt.Println("listen UDP failed,error:", err)
return
}
defer conn.Close()
//不需要建立连接,直接收发数据
var data [1024]byte
for {
n, addr, err := conn.ReadFromUDP(data[:])
if err != nil {
fmt.Println("read from UDP failed,err:", err)
return
}
fmt.Println(data[:n])
reply := strings.ToUpper(string(data[:n]))
//发送数据
conn.WriteToUDP([]byte(reply), addr)
}
}
//client
package main
import (
"bufio"
"fmt"
"net"
"os"
)
//UDP client
func main() {
socket, err := net.DialUDP("udp", nil, &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 40000,
})
if err != nil {
fmt.Println("连接服务端失败,err:", err)
return
}
defer socket.Close()
var reply [1024]byte
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("请输入内存:")
msg, _ := reader.ReadString('\n')
socket.Write([]byte(msg))
//收回复的数据
n, _, err := socket.ReadFromUDP(reply[:])
if err != nil {
fmt.Println("redv reply msg failed,err:", err)
return
}
fmt.Println("收到了回复信息:", string(reply[:n]))
}
}