Skip to content

Commit b5a62d0

Browse files
committed
💕(day14-a): Day14-A 学习笔记
1 parent 08eab75 commit b5a62d0

File tree

2 files changed

+118
-3
lines changed

2 files changed

+118
-3
lines changed

README.md

+7-3
Original file line numberDiff line numberDiff line change
@@ -136,15 +136,19 @@ Python 100 天从新手到大师个人学习笔记与实践。
136136

137137
#### ✅ Day13 - [进程和线程](./Day01-15/Day13/进程和线程.md)
138138

139+
学习笔记:[Day13 学习笔记](/day13/index.md)
140+
139141
- [x] 进程和线程的概念 - 什么是进程 / 什么是线程 / 多线程的应用场景
140142
- [x] 使用进程 - fork函数 / multiprocessing模块 / 进程池 / 进程间通信
141143
- [x] 使用线程 - thread模块 / threading模块 / Thread类 / Lock类 / Condition类 / 线程池
142144

143145
#### Day14-A - [网络编程入门](./Day01-15/Day14-A/网络编程入门.md)
144146

145-
- 计算机网络基础 - 计算机网络发展史 / “TCP-IP”模型 / IP地址 / 端口 / 协议 / 其他相关概念
146-
- 网络应用架构 - “客户端-服务器”架构 / “浏览器-服务器”架构
147-
- Python网络编程 - 套接字的概念 / socket模块 / socket函数 / 创建TCP服务器 / 创建TCP客户端 / 创建UDP服务器 / 创建UDP客户端 / SocketServer模块
147+
学习笔记:[Day14-A 学习笔记](/day14-a/index.md)
148+
149+
- [x] 计算机网络基础 - 计算机网络发展史 / “TCP-IP”模型 / IP地址 / 端口 / 协议 / 其他相关概念
150+
- [x] 网络应用架构 - “客户端-服务器”架构 / “浏览器-服务器”架构
151+
- [x] Python网络编程 - 套接字的概念 / socket模块 / socket函数 / 创建TCP服务器 / 创建TCP客户端 / 创建UDP服务器 / 创建UDP客户端 / SocketServer模块
148152

149153
#### Day14-B - [网络应用开发](./Day01-15/Day14-B/网络应用开发.md)
150154

day14-a/index.md

+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# Day14A - 网络编程入门
2+
3+
## 计算机网络
4+
5+
- 网络协议三大要素:语法、语义、时序
6+
- TCP/IP 四层模型,自底向上分别是:
7+
- 网络接口层
8+
- 网络层:IP 协议服务于该层,用于寻址和路由
9+
- 传输层
10+
- 应用层
11+
- 路由功能:存储转发我们发送到网络上的数据分组,让从源头发出的数据最终能够找到传送到目的地同路
12+
- TCP 的可靠性:
13+
1. 数据不传丢不传错(利用握手、校验和重传机制可以实现)
14+
2. 流量控制(通过滑动窗口匹配数据发送者和接收者之间的传输速度)
15+
3. 拥塞控制(通过RTT时间以及对滑动窗口的控制缓解网络拥堵)
16+
17+
## 基于传输层协议的套接字编程
18+
19+
套接字就是一套用C语言写成的应用程序开发库,主要用于实现进程间通信和网络编程,在网络应用开发中被广泛使用。
20+
21+
### TCP 套接字
22+
23+
TCP 套接字就是使用 TCP 协议提供的传输服务来实现网络通信的编程接口。
24+
25+
在 Python 中:
26+
27+
- 创建 `socket` 对象
28+
- 指定 `type` 属性为 `SOCK_STREAM`
29+
30+
#### 实现服务器程序
31+
32+
```python
33+
from socket import socket, SOCK_STREAM, AF_INET
34+
from datetime import datetime
35+
36+
37+
def main():
38+
# 1.创建套接字对象并指定使用哪种传输服务
39+
# family=AF_INET - IPv4地址
40+
# family=AF_INET6 - IPv6地址
41+
# type=SOCK_STREAM - TCP套接字
42+
# type=SOCK_DGRAM - UDP套接字
43+
# type=SOCK_RAW - 原始套接字
44+
server = socket(family=AF_INET, type=SOCK_STREAM)
45+
# 2.绑定IP地址和端口(端口用于区分不同的服务)
46+
# 同一时间在同一个端口上只能绑定一个服务否则报错
47+
server.bind(('192.168.1.2', 6789))
48+
# 3.开启监听 - 监听客户端连接到服务器
49+
# 参数512可以理解为连接队列的大小
50+
server.listen(512)
51+
print('服务器启动开始监听...')
52+
while True:
53+
# 4.通过循环接收客户端的连接并作出相应的处理(提供服务)
54+
# accept方法是一个阻塞方法如果没有客户端连接到服务器代码不会向下执行
55+
# accept方法返回一个元组其中的第一个元素是客户端对象
56+
# 第二个元素是连接到服务器的客户端的地址(由IP和端口两部分构成)
57+
client, addr = server.accept()
58+
print(str(addr) + '连接到了服务器.')
59+
# 5.发送数据
60+
client.send(str(datetime.now()).encode('utf-8'))
61+
# 6.断开连接
62+
client.close()
63+
64+
65+
if __name__ == '__main__':
66+
main()
67+
```
68+
69+
运行时:
70+
71+
```
72+
telnet 192.168.1.2 6789
73+
```
74+
75+
#### 实现客户端程序
76+
77+
```python
78+
from socket import socket
79+
80+
81+
def main():
82+
# 1.创建套接字对象默认使用IPv4和TCP协议
83+
client = socket()
84+
# 2.连接到服务器(需要指定IP地址和端口)
85+
client.connect(('192.168.1.2', 6789))
86+
# 3.从服务器接收数据
87+
print(client.recv(1024).decode('utf-8'))
88+
client.close()
89+
90+
91+
if __name__ == '__main__':
92+
main()
93+
```
94+
95+
### UDP 套接字
96+
97+
与 TCP 的区别:
98+
99+
- UDP 不对传输的可靠性和可达性做保证
100+
- 避免了 TCP 握手和重传的开销
101+
- 强调性能而不是数据完整性的场景可用 UDP
102+
103+
### 原始套接字
104+
105+
## 其他
106+
107+
### 关于端口
108+
109+
- 端口取值范围是 0~65535
110+
- 1024 下的端口称之为“著名端口”或“周知端口”(留给 FTP HTTP SMTP 等著名服务使用的端口)
111+
- 自定义的服务通常不使用“著名端口”

0 commit comments

Comments
 (0)