网络编程
一.客户端/服务器架构
UDP架构:
import socket #创建一个udp协议下的socket,需要使用参数type udp_server = socket.socket(type=socket.SOCK_DGRAM) #DGRAM : datagram 数据报 #拿到一个地址,启动程序的时候,告诉电脑,你给我这个程序分配8001端口. ip_port = ('192.168.15.113',8001) #绑定IP地址和端口 udp_server.bind(ip_port) print('准备接收消息了...') #接收消息,from_client_msg来自客户端的消息,client_addr客户端的地址('192.168.15.113', 8001) from_client_msg,client_addr = udp_server.recvfrom(1024) #阻塞住了 print(11111) print(from_client_msg) print(client_addr) #发送消息 udp_server.sendto(b'gunduzi',client_addr) #关闭udp的socket对象 udp_server.close()
import socket udp_client = socket.socket(type=socket.SOCK_DGRAM) server_ip_port = ('192.168.15.113',8001) udp_client.sendto(b'hello',server_ip_port) from_server_msg,server_addr = udp_client.recvfrom(1024) print(from_server_msg) print(server_addr) udp_client.close()
TCP架构:
import socket # 创建服务端socket对象 server = socket.socket() # 绑定IP和端口 server.bind(('192.168.13.100',8000)) # 后边可以等5个人 server.listen(5) print('服务端准备开始接收客户端的连接...') # 等待客户端来连接,如果没人连接就一直等待 # conn是客户端与服务端连接的对象,服务端以后要通过该对象进行收发数据 # addr是客户端的地址信息 # 阻塞,只有客户端进行连接,则获取客户端连接然后开始进行通信 conn,addr = server.accept() print('已经有人连接上了,客户端信息:',addr) # 通过对象去获取(客户端发送的消息) # 1024表示:服务端获取数据时,一次最多拿1024字节 data = conn.recv(1024) print('收到消息:',data.decode('utf-8')) # 服务端通过连接对象给客户端恢复一个消息 conn.send('赛利亚!你好,我是凯丽'.encode('utf-8')) # 与客户端断开连接 conn.close() # 关闭服务端的服务 server.close()
import socket client = socket.socket() # 客户端向服务端发起连接请求 # 阻塞,去连接,直到连接成功才会继续向下执行 client.connect(('192.168.13.100',8000)) # 连接上服务端后,向服务端发送消息 client.send('你好啊,我是赛利亚...'.encode('utf-8')) # 等待服务端回复消息 data = client.recv(1024) print(data.decode('utf-8')) # 关闭自己(客户端) client.close()
服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来
客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间
面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件
二.OSI7层模型
三、简述 三次握手、四次挥手的流程
#三次握手: 1.客户端(Client)向服务端(Server)发送一次请求 2.服务端确认并回复客户端 3.客户端检验确认请求,建立连接 #四次挥手: 1.客户端向服务端发一次请求 2.服务端回复客户端(断开客户端-->服务端) 3.服务端再次向客户端发请求(告诉客户端可以断开了) 4.客户端确认请求,连接断开
四、线程
import time import threading def task(a,b,c): time.sleep(3) print('佩奇拿快递去') def play(): time.sleep(4) print('陪佩奇女友出去玩') def ktv(): time.sleep(5) print('陪alex女友唱歌去') # 创建一个线程 # 让该线程去执行任务(函数) n1 = threading.Thread(target=task,args=(1,2,3,)) # 开始执行 n1.start() # 创建一个线程 # 让该线程去执行任务(函数) n1 = threading.Thread(target=play) # 开始执行 n1.start() # 创建一个线程 # 让该线程去执行任务(函数) n1 = threading.Thread(target=ktv) # 开始执行 n1.start() # 我坐家里打游戏 print('开黑,王者荣耀') print('吃鸡,四黑有没有') print('没有我一会再来')
import time import socket import threading def task(conn): time.sleep(20) data = conn.recv(1024) print(data) conn.close() server = socket.socket() server.bind(('192.168.13.100',8000,)) server.listen(5) while True: conn,addr = server.accept() n = threading.Thread(target=task,args=(conn,)) n.start()
五、进度条
def func(size,total_size): val = int(size/total_size * 100) time.sleep(0.05) print('\r%s%s%%'%('*'*val,val),end='') for i in range(101): func(i,100)