Python基础_Day16

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()

猜你喜欢

转载自blog.csdn.net/weixin_42076261/article/details/88421573