效果展示
原理图解
源码编写
go服务端的编写
package main
import (
"fmt"
"net"
)
func processData(conn net.Conn) {
//数据处理完之后关闭连接
defer conn.Close()
for {
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("服务器数据处理异常 err=", err)
return
}
fmt.Print("服务端接收到数据: ", string(buf[:n]))
conn.Write([]byte("服务器收到"))
}
}
func main() {
//第一步 监听 使用 net.listen
listen, err := net.Listen("tcp", "0.0.0.0:9999")
if err != nil {
fmt.Println("服务端开启监听失败 err=", err)
return
}
fmt.Println("服务器开始等待连接")
//第四步 关闭监听
defer listen.Close()
//第二步 等待连接 listen.Accept()
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println("服务器连接异常")
}
fmt.Printf("客户端%v连接成功", conn.RemoteAddr())
//第三步 开启协程处理数据
go processData(conn)
}
}
go语言客户端编写
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
//第一步 拨号连接 net.Dial
conn, err := net.Dial("tcp", "127.0.0.1:9999")
if err != nil {
fmt.Println("客户端连接服务器异常 err", err)
return
}
//第三步 关闭连接
defer conn.Close()
//第二步 处理数据
reader := bufio.NewReader(os.Stdin)
for {
text, err := reader.ReadString('\n')
if err != nil {
fmt.Println("数据输入失败 err ", err)
return
}
text = strings.Trim(text, " \r\n")
if text == "exit" {
fmt.Println("客户端退出")
break
}
//向服务器写数据
conn.Write([]byte(text + "\r\n"))
//监听服务器的响应
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("读取服务器数据失败 err", err)
}
fmt.Println("客户端收到服务器响应 " + string(buf[:n]))
}
}