QQ、迅雷、百度网盘客户端、、、
新浪网站、京东商城、淘宝、、、
• Transmission Control Protocol/Internet Protocol 传输控制协议,互联网协议
• Internet国际互联网络基础就是由网络层 IP协议和传输层的TCP协议组成的
• OSI模型(理论)
应用层 application
表示层 presention
会话层 session
传输层 transport
网络层 ip
数据链路层 link
物理层 physical
• TCP/IP模型(现实)
应用层 applicaton smtp、ftp、telnet、http
传输层 transport 解释数据
网络层 ip 定位ip地址和确定连接路径
链路层 link 与硬件驱动对话
• internet上的主机和路由器都有IP地址
• IP地址包含网络号和主机号
• IPV4(32位)、IPV6(128位)
• IP地址端口可以有256*256=65536个(0-65536)
• 服务程序需要监听和占用一个端口
• 0是保留端口
• 1-1024是固定端口(一般被一些程序固定使用,22:SSH,23:telnet,21:ftp,25:smtp,80:iis,7:echo)
• 1025-65535是动态端口,程序员可以使用
• netstat -an 查看本机哪些端口在监听
• netstat -anb 查看监听端口的pid
• netstat -ano 查看所有端口的进程
• taskkill -pid nnnn -f 强制关闭进程
• 服务器端 --tcp链接--> 多个客户端
• 服务端的处理流程
1. 监听端口 nnnn
2. 接收客户端的tcp链接,建立客户端和服务器端的链接
3. 创建groutine,处理该链接的请求(通常客户端会通过链接发送请求包)
• 客户端的处理流程
1. 建立与服务端的链接
2. 发送请求数据,接收服务器端返回的结果数据
3. 关闭链接 ``` server.go package main import "fmt" import "net" func process(conn net.Conn) { defer conn.Close() for { buf := make([]byte, 1024) fmt.Printf("服务器在等待客户端%s发送消息\n", conn.RemoteAddr().String()) n, err := conn.Read(buf) if err != nil { fmt.Println("从客户端退出 err=", err) return } fmt.Println(string(buf[:n])) } } func main() { fmt.Println("服务器开始监听...") listen, err := net.Listen("tcp", "0.0.0.0:8888") if err != nil { fmt.Println("listen err=", err) return } defer listen.Close() for { fmt.Println("等待客户端来链接...") conn, err := listen.Accept() if err != nil { fmt.Println("Accept() err=", err) continue } fmt.Printf("Accept() success conn=%v 客户端ip=%v\n", conn, conn.RemoteAddr().String()) go process(conn) } }
client.go package main import ( ”bufio” ”fmt” ”net” ”os” ”strings” ) func main() { conn, err := net.Dial(“tcp”, ”192.168.31.147:8888”) if err != nil { fmt.Println(“client dial err=”, err) return } defer conn.Close() reader := bufio.NewReader(os.Stdin) for { line, err := reader.ReadString(‘\n’) if err != nil { fmt.Println(“readString err=”, err) } line = strings.Trim(line, ”\r\n”) if line == ”exit” { fmt.Println(“客户端退出…”) break } _, err = conn.Write([]byte(line)) if err != nil { fmt.Println(“conn write err=”, err) } } } ```
需求分析–>设计阶段–>编码实现–>测试阶段–>实施
----------------欢迎登陆多人聊天系统:----------------
1 登录聊天系统
2 注册用户
3 退出系统
请选择(1-3):
---------------------------------------------------------
1
登录…
请输入用户id:
100
请输入用户密码:
200
你输入的 userid=10 pwd=200
server(进程,协程,端口) --> 数据库(mysql,oracle,redis,mongodb,memcache)
|
|
V
clientA clientB clientN
----------------欢迎登陆多人聊天系统:----------------
1 登录聊天系统
2 注册用户
3 退出系统
请选择(1-3):
---------------------------------------------------------
1
登录…
请输入用户id:
100
请输入用户密码:
200
你输入的 userid=10 pwd=200
Client/
main/
model/
process/
utils/