记载一个tcp 小案例
Server.go
package main
import (
"fmt"
"net"
)
// 处理链接
func proess(conn net.Conn) {
defer conn.Close()
for {
// 控制接收包大小,如果数据包过大会自动分片
buf := make([]byte, 2048)
// 获得数据,返回n字节大小
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("客户端发送内容错误:%v", err)
return
}
fmt.Println("客户端发送:" + string(buf[:n]))
}
}
func main() {
// 启动一个端口开始监听
ln, err := net.Listen("tcp", "0.0.0.0:7890")
if err != nil {
fmt.Printf("链接错误:%v\n", err)
}
// 当有链接来的时候创建一个协程,由协程去处理链接中的事情,主线程继续等待下一个链接
for {
fmt.Println("等待客户端链接")
conn, err := ln.Accept()
if err != nil {
fmt.Printf("链接错误:%v\n", err)
} else {
fmt.Printf("客户端地址:%v\n", conn.RemoteAddr())
}
go proess(conn)
}
}
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
// 创建一个客户端,连接到Server
conn, err := net.Dial("tcp", "192.168.2.110:7890")
if err != nil {
fmt.Printf("链接错误:%v\n", err)
}
for {
// 获取终端数据
fmt.Println("请输入数据:")
reader := bufio.NewReader(os.Stdin)
line, err := reader.ReadString('\n')
if err != nil {
fmt.Printf("读取数据错误:%v\n", err)
}
// 对字符串进行操作去除结尾\r\n回车换行字符
line = strings.Trim(line, "\r\n")
fmt.Println(line)
if line == "exit" {
fmt.Println("程序结束")
break
}
// 发送数据
n, err := conn.Write([]byte(line))
if err != nil {
fmt.Printf("读取数据错误:%v\n", err)
}
fmt.Printf("发送了%v个字节", n)
}
}