1、协议
1.1、链路层
1.2 网络层
1.3 传输层(端口号)
1.4 应用层
2、组包与拆包
2.1 组包
- "hello"
- 源端口+目的端口->"hello"
- 源IP+目的IP->源端口+目的端口->"hello"
- 源Mac+目的Mac->源IP+目的IP->源端口+目的端口->"hello"
2.2 拆包
- 源Mac+目的Mac->源IP+目的IP->源端口+目的端口->"hello"
- 源IP+目的IP->源端口+目的端口->"hello"
- 源端口+目的端口->"hello"
- "hello"
3、Socket介绍
4、CS模型介绍
5、TCP通讯过程
//导入net包
//1.监听
listener, err := net.Listen("tcp","127.0.0.1:8000")
if err != nil{
fmt.Println(err)
return
}
defer listener.Close()
//2.阻塞等待用户链接
for {
conn, err := net.Accept()
if err != nil{
fmt.Println(err)
continue
}
//3.接收用户的请求
buf := make([]byte,1024)
n, err1 := conn.Read(buf)
if err1 != nil{
fmt.Println(err1)
continue
}
println(string(buf[:n]))
defer conn.Close()
}
//导入net包
//1.主动连接服务器
conn, err := net.Dail("tcp","127.0.0.1:8000")
if err != nil{
fmt.Println(err)
return
}
defer conn.Close()
//2.发送数据
conn.Write([]byte("are u ok"))
6、简单并发服务器
//导入net包
//1.监听
listener, err := net.Listen("tcp","127.0.0.1:8000")
if err != nil{
fmt.Println(err)
return
}
defer listener.Close()
//2.接收多个用户
for {
conn, err := net.Accept()
if err != nil{
fmt.Println(err)
continue
}
//3.处理用户的请求
go HandleConn(conn)
}
func HandleConn(conn net.Conn){
defer Conn.Close()
//获取客户端网络信息
addr := Conn.RemoteAddr().String()
for {
//读取用户数据
n, err1 := conn.Read(buf)
if err1 != nil{
fmt.Println(err1)
continue
}
println(string(buf[:n]))
if "exit" == string(buf[:n]){
return
}
//把数据转化为大写再返回给客户端
conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
}
}
//导入net包
//1.主动连接服务器
conn, err := net.Dail("tcp","127.0.0.1:8000")
if err != nil{
fmt.Println(err)
return
}
defer conn.Close()
go func(){
buf := make([]byte,1024)
for {
n, err := conn.Read(buf)
if err != nil{
continue
}
fmt.Println(string(buf[:n]))
}
}()
//2.发送数据 主子协程程序交换位置,会中断操作(主协程中断)
for {
n,err := os.Stdin.Read(str)
if err != nil{
continue
}
conn.Write(str[:n])
}
7、文件传输
7.1 os.stat
func main(){
list := os.Args
if len(list) == 2 {
fmt.Println("err")
}
fileName = list[1]
info, err := os.Stat(fileName)
if err != nil{
return
}
fmt.Println(info.Name())
}
7.2 文件发送方
//发送文件
func SendFile(path string,conn net.Conn){
//以自读方式打开文件
f,err := os.Open(path)
if err != nil{
return
}
defer f.Close()
//读文件内容,读多少就发多少
buf := make([]byte,4*1024)
for{
n,err = f.Read(buf)
if err!= nil{
if err == io.EOF{
fmt.Println("文件结束")
}
else{
fmt.Println("err = ",err)
}
}
//发送内容,发送给服务器
conn.Write(buf[:n])
}
}
func main(){
var path string
fmt.Scan(&path)
info, err := os.Stat(path)
if err != nil{
return
}
fmt.Println(info.Name())
//1.主动连接服务器
conn, err1 := net.Dail("tcp","127.0.0.1:8000")
if err1 != nil{
return
}
defer conn.Close()
—,err2 := conn.Write([]byte(info.Name))
if err2 != nil{
return
}
var n int
buf := make([]byte,1024)
//如果收到ok则成功
n, err3 := conn.Read(buf)
if string(buf[:n]) == "ok"{
//发送文件内容
SendFile(path,conn)
}
}
7.2 文件接收方
func ReciveFile(fileName string, conn net.Conn){
//新建文件
f,err := os.Create(fileName)
if err != nil{
return
}
buf := make([]byte,1024*4)
//接收多少写多少
for{
n, err := conn.Read(buf)
if err != nil{
if err == io.EOF {
}
else
{
return
}
}
f.Wirte(buf)//往文件写内容
}
}
func main(){
//1.监听
listener, err := net.Listen("tcp","127.0.0.1:8000")
if err != nil{
fmt.Println(err)
return
}
defer listener.Close()
//等待用户连接
conn, err1 := net.Accept()
if err1 != nil{
fmt.Println("xxxx")
return
}
//读取对方发送的文件名
buf := make([]byte,1024)
n, err2 := conn.Read(buf)
if err2 != nil{
return
}
fileName := string(buf[:n])
//回复OK
conn.Write([]byte("ok"))
//接收文件内容
ReciveFile(fileName,conn)
}
8、聊天室
8.1