TCP编程
1、网络编程分类
包括TCPsocket编程(底层基于tcp/ip协议)和b/s结构的http编程(使用的是http协议,但是底层是tcp socket实现的)
资料:尚硅谷的TCP资料(3卷),可以咸鱼找下资料看下
2 TCPsocket编程
windows查看端口密码:netstat -anb; netstat -an
- 服务器端的处理流程
- 监听端口;接受客户端的tcp链接;建立客户端和服务端的链接;创建goroutine,处理该链接的请求
- 客户端的处理流程
- 建林与服务器的链接
- 发送请求数据【终端】,即可收服务端返回的结果数据
- 关闭链接
服务端代码
package main
import (
"fmt"
"net"
)
func process(conn net.Conn){
//循环接受客户端发送的数据
defer conn.Close() //关闭conn
for {
//创建一个新的切片
buf := make([]byte, 1024)
//conn.Read(buf)
//1、等待客户端通过conn发送信息
//2、如果客户端没有wirte,那么协程就阻塞在这里
//fmt.Printf("服务器在等待客户端 %v 发送信息\n", conn.RemoteAddr().String())
n, err :=conn.Read(buf) //从conn读取数据
if err != nil{
fmt.Println("服务器的Read err=", err)
return
}
//3、显示客户端发送的内容到服务器的终端
fmt.Print(string(buf[:n]))
}
}
func main() {
fmt.Println("服务器开始监听...")
listen, err := net.Listen("tcp", "0.0.0.0:9988")
if err != nil {
fmt.Println("listen err = ", err)
return
}
defer listen.Close() //演示关闭listen
//循环等待客户端链接
for {
fmt.Println("等待客户端连接")
conn, err := listen.Accept() //等待客户端连接
if err != nil {
fmt.Println("Accept() err=", err)
} else {
fmt.Printf("Accept() suc=%v 客户端IP=%v\n", conn, conn.RemoteAddr().String())
}
//准备起一个客户端为客户端服务
go process(conn)
}
//fmt.Printf("listen=%v\n", listen)
}
客户端代码
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:9988")
if err != nil {
fmt.Println("client dial err=", err)
return
}
//功能1:客户端发送单行数据,然后退出
reader := bufio.NewReader(os.Stdin)
for {
//从终端读取用户输入,发送给服务器
line, err := reader.ReadString('\n')
if err != nil {
fmt.Println("readingstring err=", err)
}
//如果用户输入exit就退出
line = strings.Trim(line," \r\n")
if line== "exit"{
fmt.Println("客户端退出...")
break
}
//再将line发送给服务器
_, err = conn.Write([]byte(line + "\n"))
if err != nil {
fmt.Println("conn.Write err=", err)
}
}
}
标签:err,fmt,编程,tcp,Println,go,conn,客户端
From: https://www.cnblogs.com/ua-21/p/17488992.html