TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP服务端TCP服务端程序的处理流程:
启动本地服务,监听端口号等待建立连接读取Client端发送的数据向Client端发送数据服务端代码如下(server.go):
package main
import (
"LearnGo/src/code/tcp_demo/utils"
"fmt"
"net"
"strings"
)
func main() {
// 1.启动本地服务,监听端口号
listen, err := net.Listen("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Println("listen failed, ", err)
return
}
fmt.Println("服务已启动,等待连接...")
// 2.等待建立连接
conn, err := listen.Accept()
if err != nil {
fmt.Println("Accept failed, ", err)
return
}
fmt.Println("连接成功! 开始对话! ")
fmt.Println("======================")
defer conn.Close()
for {
// 3. 读取Client端发送的数据
receiveData := utils.ReceiveData(conn)
if strings.ToUpper(receiveData) == "Q" {
return
}
fmt.Println("Client端:")
fmt.Println(receiveData)
// 4.向Client端发送数据
fmt.Println("Server端:")
sendData := utils.SendData(conn)
if strings.ToUpper(sendData) == "Q" {
return
}
}
}
TCP客户端
TCP客户端程序的处理流程:
拨号,建立连接向Server端发送数据读取Server端发送的数据客户端代码如下(client.go):
package main
import (
"LearnGo/src/code/tcp_demo/utils"
"fmt"
"net"
"strings"
)
func main() {
// 1.拨号,建立连接
conn, err := net.Dial("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Println("Dial failed, ", err)
return
}
fmt.Println("连接成功! 开始对话! ")
fmt.Println("======================")
defer conn.Close()
for {
// 2.向server端发送数据
fmt.Println("Client端:")
sendData := utils.SendData(conn)
if strings.ToUpper(sendData) == "Q" {
return
}
// 3.读取server端发送的数据
receiveData := utils.ReceiveData(conn)
if strings.ToUpper(receiveData) == "Q" {
return
}
fmt.Println("Server端:")
fmt.Println(receiveData)
}
}
其中,发送数据和读取数据方法抽取到 utils.go ,代码如下:
package utils
import (
"fmt"
"net"
)
// 发送数据
func SendData(conn net.Conn) string {
var s string
fmt.Scan(&s)
_, err := conn.Write([]byte(s))
if err != nil {
fmt.Println("写入数据失败!", err)
}
return s
}
// 读取数据
func ReceiveData(conn net.Conn) string {
var tmp [128]byte
n, err := conn.Read(tmp[:])
if err != nil {
fmt.Println("读取数据失败!", err)
}
return string(tmp[:n])
}
运行结果
启动 server 端 启动 client 端 client 端发送数据,server 端接收数据并发送数据 输入“q”或“Q”,退出程序先运行 server.go,再运行 client.go,运行结果如下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)