这里写目录标题
- TCP客户端(client)
- TCP服务端(server)
TCP客户端(client)
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
/*
一个TCP客户端进行TCP通信的流程如下:
1.建立与服务端的链接
2.进行数据收发
3.关闭链接
*/
//1.与服务器建立连接
//2.进行连接数据收发
//2.1从终端读取信息
//2.2发送到服务器
//2.3接收服务器信息
func main() {
//1.与服务器建立连接
conn, err := net.Dial("tcp", "127.0.0.1:20001")
if err != nil {
fmt.Printf("dial failed,err:%v", err)
return
}
//2.根据链接进行数据收发
//2.1创建一个从终端读取的对象
input := bufio.NewReader(os.Stdin)
//for就是一直发送接收
for {
//2.2利用从终端读取信息的对象读到换行
ss, _ := input.ReadString('\n')
//2.3把读取的信息空格去掉
strings.TrimSpace(ss)
//2.4如果ss内容是大写就退出
if strings.ToUpper(ss) == "Q" {
return
}
//2.5如果ss内容不是q,就将终端的内容写入链接
n, err := conn.Write([]byte(ss))
if err != nil {
fmt.Printf("send failed,err:%v\n", err)
}
//fmt.Println(n)
//2.6从服务端读消息
//2.6.1这只一次读多少内容
var buf [1024]byte
//2.6.2开始读取信息
n, err = conn.Read(buf[:])
if err != nil {
fmt.Printf("read failed,err:%v",err)
}
//fmt.Printf("读取了%d字节\n", n)
fmt.Printf("收到服务端回复:%v",string(buf[:n]))
//3.关闭链接
}
}
TCP服务端(server)
package main
import (
"bufio"
"fmt"
"net"
)
/*
TCP服务端程序的处理流程:
监听端口
接收客户端请求建立链接
创建goroutine处理链接。
*/
//创造处理链接的函数
func process(conn net.Conn) {
//2.最后要关闭这个链接
defer conn.Close()
//1.根据链接进行数据的接收和发送操作
//1.1根据这个tcp链接conn,创建一个从链接conn读的对象
reader := bufio.NewReader(conn)
//1.
var buf [128]byte
n, err := reader.Read(buf[:])
if err != nil {
fmt.Printf("read from conn failed,err:%d", err)
}
ret := buf[:n]
fmt.Printf("从链接读取的数据是:%v", string(ret))
conn.Write([]byte("亲亲,收到了"))
}
func main() {
//1.启动监听 先放上耳朵
listener, err := net.Listen("tcp", "127.0.0.1:20001")
if err != nil {
fmt.Printf("listen failed,err:%v", err)
return
}
//2.等待客户建立连接 //for不断的建立链接处理链接
for {
conn, err := listener.Accept() //如果err为空,代表拿到了链接
if err != nil {
fmt.Printf("conn accept failed,err:%v", err)
continue
}
//3.启动gouroutine去处理链接
go process(conn)
}
}
代码在编辑器的位置:
注意:
1.先启动服务端
2.在启动客户端