1.听写:
字符串:
str0 = "abcdefghello"
1.str0[2:5:]的结果是什么 "cde"
2.将字符串转化为大写字母 str0.upper()
3.获取e第一次出现的位置 str0.find("e")
4.判断字符串的内容是否是纯数字 str0.isdigit()
生成列表 列表的内容为[1, 2, 3]
list0 = [1, 2, 3]
[i for i in range(1, 4)]
[1, 2].append(3)
[1, 2].extend([3])
将列表[12, 34]中的元素拼接到列表[19, 21, 33]的末尾
[19, 21, 33].extend([12, 34])
将字典中的键值颠倒 使用一句代码完成
dict0 = {"A":"a", "B":"b"}
{v:k for k, v in dict0.items()}
dict(zip(dict0.values(), dict0.keys()))
dict([[12, 34],[28, 37]]) ---> {12:34, 28:37}
字典的key的类型是内容不可变类型:
整型
字符串类型
元组类型
自定义数据类型
2.网络编程
1.计算机网络
2.网络通信的七层宝塔(OSI模型)
3.通信的三要素
4.基于socket进行网络编程
2.1计算机网络
多台独立的计算机通过网络通信设备连接起来的网络 实现数据传递和资源共享
2.2网络通信七层宝塔
OSI通信模型:
应用层 ---> 协议:http / https协议 客户端应用:QQ 微信
表示层 ---> 对数据进行解释加密
2.3网络通信三要素
ip地址 端口号 通信协议
IP地址
IP地址是一个32位的二进制数,把32位分成四份, 每一份是八位,将每一份转化为十进制 每一份之间使用.隔开
8位二进制数 总共有256个数 没有负数 取值是从0~255
IP地址的分类:
IPV4 和 IPV6(128b的)
IPV6的网段范围更广
IP地址的作用:
用于标识网络通信上的计算机 这个标识在网络通信中是唯一的
简单而言:IP地址是来查找进行通信的对应的那台计算机的
ip地址的特殊网段:
127.0.0.0 ~ 127.255.255.255 ---> 用于标识自己的那台电脑
一般使用[127.0.0.1]来表示本机地址 这个地址称之为回环地址
在自己电脑上想使用自己电脑的IP地址 但是不想去查具体的IP地址 可以使用127.0.0.1来表示
端口号
是一个16位的二进制数 没有负数 数值个数是2^16 = 65536
端口号的取值范围是0 ~ 65535
作用:
定位进行通信的应用程序
注意:
相同的通信协议下 不同的应用程序的端口号不能相同
建议尽量不要使用1024以下的端口号 因为这些端口号已经被一些知名的协议占用 或者 被一些公司备用
http协议 80
smtp(发送邮件需要遵守的协议) 25
https 143
通信协议
协议:制定的通信的规则
如果想进行通信 双方必须得遵守对应的规则
传输层协议:TCP协议 和 UDP协议
UDP协议:
用户数据协议: User Datagram Protocol
特点:
面向无连接的[通信双方可以不建立连接通信的通道直接给传递消息]
发送数据时 采用的是以数据报的形式进行数据传递的
发送数据大小限制: 64Kb之内
不可靠协议 非安全协议
数据传递速率快的
现实中的实例:视频聊天
TCP协议:
传输控制协议: Transmission Control Protocol
特点:
面向连接的 必须建立间接数据通道
数据传递是以数据流的形式传递的
可以传递大数据 但是需要双方制定数据格式
可靠安全的协议
数据传递传递速率慢
现实的实例打:电话
连接的时候有个操作"三次握手":
建立连接的过程
1.发送者发送连接请求给接受者
2.接受者接受到发送者的请求 并给发送者回馈一个标记 允许建立连接
3.发送者接收到接受者回馈的允许建立连接的标记 再给接受者发送一个状态告知进行连接了
打电话:
拨通对方的号码 ---> 发送连接请求
对方看到来电 接通电话 回馈给连接上的状态" 喂"
接受到对方的连接回馈 回应给对方一个连接上的状态 "喂"
2.4基于socket进行网络编程
socket 意思是 插座和底座的意思 被当做进行通信的手柄
进行通信的时候 发送方和接受方 都是应用程序 在双方的应用程序中都有一个socket手柄来操作通信的进程
通信机制存放于 socket模块中的
基于UDP的通信机制
UDP是以数据包的形式进行数据传递的
对应的ip地址 该程序的端口号 以及要发送的信息 都包含在数据包里
# 发送方
import socket
def main():
#1. 建立UDP通信手柄
send_socket = socket.socket(type=socket.SOCK_DGRAM)
# 发送数据: 发送的是字节数据
'''
1.发送的数据以字节数据形式发送的
2.接受的者ip地址 和 当前应用程序的端口号
(ip地址, 端口号)
'''
send_socket.sendto("你好".encode("utf-8"), ("10.0.128.114", 10086))
# 关闭通信
send_socket.close()
if __name__ == '__main__':
main()
# 接收方
import socket
def main():
re_socket = socket.socket(type=socket.SOCK_DGRAM)
# 给自己绑定ip地址(自己的)和 端口号(发送者设置的端口号是一致的) ---> 便于别人查找
re_socket.bind(("10.0.128.114", 10086))
# 接受数据 需要设置一个接受数据的缓冲区字节大小
data = re_socket.recvfrom(1024)
print(data) # (b'\xe4\xbd\xa0\xe5\xa5\xbd', ('10.0.128.114', 61526))
print("%s对你说:%s" % (data[1][0], data[0].decode("utf-8")))
re_socket.close()
if __name__ == '__main__':
main()
基于TCP的通信机制
在进行通信之前要先进行连接
# 发送方
import socket
def main():
#1. 设置通信手柄
s_scoket = socket.socket(type=socket.SOCK_STREAM)
#2. 设置要连接IP地址和程序的端口号
addr = ("10.0.128.114", 10011)
#3. 发起连接
s_scoket.connect(addr)
# 连接好了之后 通信通道已经建立好了
while True:
send_message = input("请输入要发送的信息:")
s_scoket.send(send_message.encode("utf-8"))
if send_message == "byebye":
break
# 接受回复信息
receiver_data = s_scoket.recv(1024)
print("%s回复说:%s" % (addr[0], receiver_data.decode("utf-8")))
if receiver_data.decode("utf-8") == "byebye":
break
s_scoket.close()
if __name__ == '__main__':
main()
# 接收方
import socket
def main():
#1. 创建一个通信手柄
r_socket = socket.socket(type=socket.SOCK_STREAM)
#2. 绑定自己的IP地址 与 程序的端口号
r_socket.bind(("10.0.128.114", 10011))
#3. 设置监听 允许几个发送者同时进行连接
r_socket.listen(1)
#4. 准备接受连接
send_socket, addr = r_socket.accept()
if send_socket != None:
print("连接成功")
while True:
# 接受数据
receiver_data = send_socket.recv(1024)
print("%s发送消息说:%s" % (addr[0], receiver_data.decode("utf-8")))
if receiver_data.decode("utf-8") == "byebye":
break
# 给发送者回复消息
reply_message = input("请输入要回复的消息:")
send_socket.send(reply_message.encode("utf-8"))
if reply_message == "byebye":
break
r_socket.close()
if __name__ == '__main__':
main()
模拟文件的传递
客户端
用户操作的应用程序
服务器端
存储数据 客户端想要什么数据 向服务器端请求 服务器端根据请求的信息 在数据库中进行查找 获取对应的信息 把信息返回给客户端
模拟文件上传[上传到服务器] --- 文件下载[在服务器端下载下来]
服务器端这一块需要设置两个状态:
一个用于接受客户端的上传(upload) 一个用于接受客户端的下载(down)
上传文件的客户端:
给服务器发送的信息:
1.上传的状态 告知服务器是接受数据
2.传递文件的内容[读取本地文件]
3.传递一个文件的名字
4.传递文件大小 告知服务器服务器文件状态 什么情况下接受完毕
发送内容的顺序:
状态 文件名 文件大小
upload|image.png|1024
文件的内容
接受上传文件状态的服务器端:
设置状态值 upload / down
# 服务器
import socket
import os
# 服务器端是被连接的 不会主动连接客户 允许进行连接
def main():
r_socket = socket.socket(type=socket.SOCK_STREAM)
# 绑定自己的ip地址和端口号
r_socket.bind(("10.0.128.186", 6666))
# 设置监听
r_socket.listen(1)
# 等待被连接
client_socket, addr = r_socket.accept()
if client_socket != None:
print("连接成功")
# 先接受一波数据
data = client_socket.recv(1024)
message = data.decode("utf-8")
sub_list = message.split("|")
print(sub_list)
if sub_list[0] == "upload":
# 获得文件名字
filename = sub_list[1]
# 文件大小
filesize = int(sub_list[2])
# 设置一个读取的变量
has_read = 0
# 获取通信通道中的文件内容数据 把这些数据写入到虚拟文件中去
with open(filename, "wb") as handle:
while has_read < filesize:
# 在通信通道中读取
filedata = client_socket.recv(1024)
handle.write(filedata)
has_read += 1024
elif sub_list[0] == "down":
path = r"C:\Users\Administrator\Pictures\Saved Pictures\timg.jpg"
# 获得文件的名字
filename = os.path.basename(path)
# 文件的大小
filesize = os.path.getsize(path)
# 先发送一波信息
message = "%s|%d" % (filename, filesize)
client_socket.send(message.encode("utf-8"))
has_send=0
with open(path,"rb") as file:
while has_send<filesize:
filedata=file.read(1024)
client_socket.send(filedata)
has_send+=1024
if __name__ == '__main__':
main()
# 客户端
# 下载
import socket
def main():
s_socket = socket.socket(type=socket.SOCK_STREAM)
# 设置要连接的服务器的地址
server_addr = ("10.0.128.114", 6666)
# 建立连接
s_socket.connect(server_addr)
# 发送状态
s_socket.send("down".encode("utf-8"))
data = s_socket.recv(1024)
message = data.decode("utf-8")
sub_list = message.split("|")
# 获得文件名字
filename = sub_list[0]
# 文件大小
filesize = int(sub_list[1])
# 设置一个读取的变量
has_read = 0
# 获取通信通道中的文件内容数据 把这些数据写入到虚拟文件中去
with open(filename, "wb") as handle:
while has_read < filesize:
# 在通信通道中读取
filedata = s_socket.recv(1024)
handle.write(filedata)
has_read += 1024
if __name__ == '__main__':
main()
# 上传
import socket
def main():
s_socket = socket.socket(type=socket.SOCK_STREAM)
# 设置要连接的服务器的地址
server_addr = ("10.0.128.186", 6666)
# 建立连接
s_socket.connect(server_addr)
path = r"C:\Users\Administrator\Pictures\Saved Pictures\timg.jpg"
# 获得文件的名字
filename = os.path.basename(path)
# 文件的大小
filesize = os.path.getsize(path)
# 先发送一波信息
message = "upload|%s|%d" % (filename, filesize)
client_socket.send(message.encode("utf-8"))
had_read = 0
with open(filename,"rb") as handle:
while had_read < filesize:
filedata=file.read(1024)
client_socket.send(filedata)
has_send+=1024
if __name__ == '__main__':
main()