一、网络编程
1.1网络编程三要素
IP地址:设备在网络中的唯一标识。
Windows中查看IP地址:ipconfig
在Linux或Mac系统中用:ifconfig
端口:传输数据的入口,类似于门。端口是程序在设备上的唯一标识。
Windows中用netstat -ano 查看,如果是Linux或者Mac系统用命令 netstat -anp查看。
协议:通信规则。有两种TCP和UDP。
1.2握手和挥手
这个点在面试题常出现,指的是客户端和服务器端建立连接和断开连接时的过程。
三次握手(建立连接):
-
客户端像服务器端发出请求, 申请建立连接。
-
验客户端数据合法后, 给出客户端回执信息, 可以建立连接。
-
客户端重新向服务器端发出请求, 建立连接。
四次挥手(断开连接):
A => B B => A 因为TCP协议是双向的, 需要两个方向都断开, 所以会交互4次。
1.3网络编程流程
格式如下:
# 在TCP服务器程序开发流程:
# 1.创建服务器端socket对象
# 2.绑定服务器IP和端口
# 3.设置监听数量
# 4.等待客户端的连接,如有返回与客户端交互的socket对象和客户端IP地址
# 5.给客户端发送数据
# 6.接收客户端发送的数据
# 7.释放与客户端交互的socket对象
# TCP客户端程序开发流程:
# 1. 创建客户端socket对象
# 2. 连接服务器端IP和端口
# 3.接收服务器端发送的数据
# 4.给服务器端发送数据
# 5.释放资源
代码如下:
# 需求:通过TCP客户端发送消息:Hello 文柏! 通过TCP服务器端接收消息,并打印出来。
# 导包
import socket
if __name__ == '__main__':
# 客户端
# 1. 创建客户端socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 连接服务器端IP和端口
client_socket.connect(('192.168.*.*', 6666))
# 3.给服务器端发送数据
client_socket.send('Hello 文柏!'.encode('utf-8'))
# 4.释放资源
client_socket.close()
# 服务器端
# 1.创建服务器端socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.绑定服务器IP和端口
server_socket.bind(('192.168.*.*', 6666))
# 3.设置监听数量
server_socket.listen(3)
# 4.等待客户端的连接,如有返回与客户端交互的socket对象和客户端IP地址
accept_socket, client_info = server_socket.accept()
# 5.接收客户端发送的数据
recv_byt_data = accept_socket.recv(1024)
recv_data = recv_byt_data.decode('utf-8')
print(recv_data)
# 7.释放与客户端交互的socket对象
accept_socket.close()
案例:模拟客户端向服务器端发送文件。
# 客户端
# 导包
import socket
if __name__ == '__main__':
# 创建客户端socket对象
cli_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 连接服务器端
cli_socket.connect(("192.168.*.*",8888))
# 读取数据源文件信息,并发送数据到服务器
with open('d:/1.txt','rb') as src_f:
# 分批次读取,一次读1024字节
while True:
# 具体读取的动作
data = src_f.read(1024)
# 将读取到的数据发给服务器端
cli_socket.send(data)
# 判断是否读取完毕
if len(data) <= 0:
break
# 释放资源
cli_socket.close()
# 服务器端
# 导包
import socket
if __name__ == '__main__':
# 创建服务器端对象
ser_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定服务器端IP和端口
ser_socket.bind(("192.168.*.*",8888))
# 设置监听数量
ser_socket.listen(5)
# 启动监听等待客户端连接 如有 则返回与客户端交互的对象和客户端信息
accept_socket, client_info = ser_socket.accept()
# 接收客户端发送的文件
# 关联目的地文件,用于把客户端发送的数据写到其中.
with open('./data/client.txt','wb') as dest_f:
#循环接收客户端发过来的文件数据
while True:
# 具体的接收动作
recv_data = accept_socket.recv(1024)
# 判断接收的文件是否为空 即是否接收完毕
if len(recv_data) <= 0:
break
# 把接收到数据写入目的文件中
dest_f.write(recv_data)
# 释放资源
accept_socket.close()
二、进程和线程
进程: 指的是可执行程序(例如: *.exe), 也是CPU分配资源的最小单位。
线程: 指的是进程的执行路径, 也是CPU调度的最小执行单元。
案例:
# 请使用多任务形式完成:一边编程、一边听音乐、一边跟同事聊天。要求如下:
#a.使用多进程完成;
# 导包
import multiprocessing,time
# 定义写代码函数
def coding():
for i in range(33):
# 加入睡眠,增强效果
time.sleep(0.01)
print('编写代码中请勿打扰...')
# 定义听音乐函数
def music():
for i in range(20):
# 加入睡眠
time.sleep(0.01)
print('听着小曲儿,哼着歌******')
# 定义聊天函数
def spk():
for i in range(30):
# 加入睡眠
time.sleep(0.01)
print('Hello World$$$$$$$')
if __name__ == '__main__':
# 创建进程对象
c1 = multiprocessing.Process(target=coding)
m1 = multiprocessing.Process(target=music)
s1 = multiprocessing.Process(target=spk)
# 启动进程
c1.start()
m1.start()
s1.start()