服务端
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
listen, err := net.Listen("tcp", "127.0.0.1:8989")
if err != nil {
fmt.Println("监听端口失败,退出程序...,error:", err)
return
}
defer func() { _ = listen.Close() }()
var conn net.Conn
mainOut01:
for {
conn, err = listen.Accept()
if err != nil {
fmt.Println("获取conn失败,error: ", err)
break mainOut01
}
fmt.Println(conn.RemoteAddr(), " connected the server ... ")
go ServerReceiveDataSolve(conn)
go ServerSendData(conn)
}
}
func ServerReceiveDataSolve(conn net.Conn) {
for {
bytes := make([]byte, 1024)
readLen, err := conn.Read(bytes)
if err != nil {
fmt.Println("读取数据出现异常,error is: ", err)
fmt.Println("客户端断开...")
return
}
content := string(bytes[0:readLen])
fmt.Printf("读到的数据内容为-:%v", content)
if content == "quit\r\n" {
fmt.Println("服务器端接收数据协程关闭")
break
}
}
}
func ServerSendData(conn net.Conn) {
for true {
stdin := os.Stdin
reader := bufio.NewReader(stdin)
data, err := reader.ReadString('\n')
if err != nil {
fmt.Println("从终端获取数据失败, error is:", err)
}
byteSize, err := conn.Write([]byte(data))
if err != nil {
fmt.Println("服务端发送数据失败,error is:", err)
}
fmt.Println("服务端发送的内容为:", data, " 其字节大小(包含\\r\\n)为:", byteSize)
if data == "quit\r\n" {
fmt.Println("服务器端发送数据协程关闭")
break
}
}
}
客户端
package main
import (
"bufio"
"fmt"
"net"
"os"
)
var (
exetChannel = make(chan bool, 2)
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8989")
if err != nil {
fmt.Println("获取连接失败,退出程序... error is:", err)
return
}
defer func() { _ = conn.Close() }()
go ClientSendData(conn)
go ClientReceiveDataSolve(conn)
for {
if len(exetChannel) == 2 {
<-exetChannel
<-exetChannel
break
}
}
}
func ClientSendData(conn net.Conn) {
for true {
stdin := os.Stdin
reader := bufio.NewReader(stdin)
data, err := reader.ReadString('\n')
if err != nil {
fmt.Println("从终端获取数据失败, error is:", err)
}
byteSize, err := conn.Write([]byte(data))
if err != nil {
fmt.Println("客户端发送数据失败,error is:", err)
}
fmt.Println("客户端发送的内容为:", data, " 其字节大小(包含\\r\\n)为:", byteSize)
if data == "quit\r\n" {
fmt.Println("客户端的发送协程关闭")
exetChannel <- true
break
}
}
}
func ClientReceiveDataSolve(conn net.Conn) {
for {
bytes := make([]byte, 1024)
nBytes, err := conn.Read(bytes)
if err != nil {
fmt.Println("客户端读取数据失败,error is:", err)
break
}
fmt.Println("客户端读取到的内容为:", string(bytes[:nBytes]), "大小为:", nBytes)
if string(bytes[0:nBytes]) == "quit\r\n" {
fmt.Println("客户端的接收协程关闭")
exetChannel <- true
return
}
}
}
测试
