python高级 笔记 04 (虚拟环境和网络通信)

虚拟环境

可以让两个不同的项目(运行环境不同)同时在一个服务器上面执行。
多个python之间相互独立,互不影响。
在这里插入图片描述

虚拟环境的安装

sudo pip install virtualenv

sudo pip install virtualenvwrapper

在这里插入图片描述

创建虚拟环境

mkvirtualenv 虚拟环境名称

例如:
mkvirtualenv env1

下面是创建了一个 名为mywork的虚拟环境

在这里插入图片描述
在这里插入图片描述

workon 虚拟环境名

进入该虚拟环境

deactivate

退出虚拟环境

只输入 workon
可以查看一共几个虚拟环境
在这里插入图片描述

rmvirtualenv 虚拟环境名

在这里插入图片描述
指定python版本创建虚拟环境

mkvirtualenv -p python解释器的位置 虚拟环境名

在这里插入图片描述

注意 这个虚拟环境,仅限于python的配置

pycharm 选择创建的虚拟器环境的配置
在这里插入图片描述

总结

创建虚拟环境
mkvirtualenv 虚拟环境名
进入虚拟环境
workon 虚拟环境名
查看所有虚拟环境
workon 回车
退出虚拟环境
deactivate
删除虚拟环境
rmvirtualenv 虚拟环境名
创建虚拟环境,指定python版本
mkvirtualenv -p python路径
一般为 /usr/bin/pythonx.x xxx

网络通讯概述

什么是网络

相互连接,共享资源的多台计算机的集合。
网络可以将 多方联系在一起。
在这里插入图片描述

网络通讯:实习计算机之间的信息交流。

IP 地址

用于标识 网络上 唯一的一台主机。

地址: 用来标记地点的。
IP地址: 互联网协议
internet protocol address
网际协议地址
IP协议同一个的地址格式。

IP 地址作用

网络中 标记一台电脑,给网络中的每台计算机分配的唯一标志符号。

192.168.1.1 是在本地局域网上的唯一。
就如同一个人的身份证号码一样。
在这里插入图片描述
ip一共有四段
每一段都用 . 进行分割。
前面三段一般都一样,最后一段经常改变。

ip地址的范围通常为:
xxx.xxx.xxx.0 到 xxx.xxx.xxx.255
但是有两个特殊的ip地址一般是不用的。
xxx.xxx.xx.0 表内部
xxx.xxx.xx.255表 广播地址
256-2 = 254
最多可以表示254台计算机。

ip地址 两部分组成: 网络号 + 主机号
网络号
xxx.xxx.xxx
主机号
0-255
网络号增加一段
xxx.xxx.0.0 到 xxx.xxx.255.255

IP地址分类

目前。所说的ip地址,是 ipv4协议。
IP地址 = 网络号 + 主机号

在这里插入图片描述
eg:
192.168.31.247
是属于C类地址
我们目前最常用的就是C类地址日期
192.168.31 都固定不变。最后一段 变更。

私有IP

局域网使用的IP

就好比一个教室内,所有电脑都使用的一个网络
在这里插入图片描述

特殊的IP地址

127.0.0.1
用于做 回路测试
测试本机中配置的web服务器。

就是电脑不插网线,也可以看到的地址。
表示本机的地址。

特殊的域名

localhost
本机域名,用来解析到 本机127.0.0.1ip地址上。

两台计算机如何通讯

李四 给 张三 发消息: 晚上约饭

知道 张三的ip地址(对方ip地址)
自己的ip: 192.168.10.2
发送内容:一起吃饭
通过网络中间设备 一个一个传递

张三 回复 李四
知道 李四ip地址
自己的ip地址: 192.168.30.5
发送内容:行
通过网络中间设备 一个一个传递

在这里插入图片描述

IPV4 和 IPV6

IPV4
xxx.xxx.xxx.xxx 点分10进制

IPV6
xxx:xxx:xxx:xxx… 冒号分16进制
目前的IPV4地址已经不够用了
0.0.0.0 - 255.255.255.255
总共42亿个

IPV6号称能为世界上每一粒沙子分配IP地址。

总结

ip地址: 网络设备为 网络中每一个台计算机分配唯一的标识。
ip地址v4: 点分 10进制 xxx.xxx.xxx.xxx 每一段0——255
pi地址分类: 常用的是C类地址
私有IP地址:172.16.xxx.xxx
192.168.xxx.xxx
本机地址:127.0.0.1
IPV6:冒号分割, 分16进制。

在这里插入图片描述

IP地址查看ifconfig

ifconfig 查看ip地址
ping 测试两个电脑间能否通信

虚拟机网卡设置

NAT模型(网络地址转换模式)
虚拟机 使用 主机 VMnet8这块虚拟网卡 和 真是机进行通信。

虚拟机 设置 net模型,表示和 实体机 共享网络上网。
利用物理主机进行上网。

eg:
在mac上的虚拟机
net模式下
上网是通过 mac的ip上网的。

Bridge模型
虚拟机 就如同一台真正存在的电脑
通过交换机 申请一个 独立的 ip地址
可以跟 教室任何一台电脑通讯(内部本地局域网内)

在这里插入图片描述
如果想让 虚拟机上网,不能使用 bridge模式。
使用NAT模式,物理机可以上网的话,虚拟机就可以上网。

查看ip地址

window查看ip地址
在这里插入图片描述
或者终端输入: ipconfig

mac系统和ubuntu系统查看
终端输入:ifconfig

在这里插入图片描述
en9
en0
en1

每一块就是一张网卡
很多都是虚拟的
en9是物理的ip地址
在这里插入图片描述

测试两台计算机是否可以通讯-ping

ping 另一台的ip地址
下图表示 网络可以通讯

在这里插入图片描述
下图表示网络不可达
在这里插入图片描述

总结

虚拟机联方式
NAT:虚拟机和物理主机共用网络。
桥接:虚拟机能获取局域网的i地址。
ifconfig:查看ip地址。
ping: 检测某个主机是否建立连接。

端口

port
用于区分
计算机 是 从哪个软件 到 哪个软件上了。
计算机上不同的软件,监听的是不同的端口号。
在这里插入图片描述
端口分为 虚拟端口 和 物理端口。
在这里插入图片描述
举例子:
电脑A 通过 QQ 发送 你好 给 计算机B
在这里插入图片描述
端口 有 65536个。 2的16次方个。

端口号

端口就是通过端口号来进行分配的,端口号只有整数,
从0 到 65535.

端口号如何分配

端口分为 知名端口 和 一般端口

知名端口 well known ports

范围是 从 0 —— 1023
就好比 手机号里面的 110,119 , 10086等
在这里插入图片描述

动态端口 dynamic ports

1024-65535
不固定分配某种服务,而是动态分配。

查看端接口
netstat命令 查看 TCP/IP 协议
使用的端口
在这里插入图片描述
一般和grep通过管道命令一起使用查看端口占用情况

netstat -an |grep:22
查看22号端口情况
在这里插入图片描述

lsof -i :22
查看某端口号的使用情况

eg: 查看端口号22的使用情况
在这里插入图片描述

总结

端口:程序 对外 收发 的边界/交流的出口。
分类: 知名端口 和 动态端口。
知名端口: 0-1023,固定不变。
动态端口:1024-655345,程序可以绑定。

21 FTP服务
22 SSH服务
80 Web服务器
端口查看 netstat
查看所有 netstat -an
搜索某一个端口: netstat -an | grep :端口号
查看某个端口是哪个程序在使用: sudo |lsof -i 端口号

以22号端口举例子:
在这里插入图片描述

网络传输方式

面向连接
面向无连接
UDP网络传输方式

两台计算机 联系 必须有IP地址
计算机上的软件通讯,必须 有 端口号

传输方式: 就是 数据 如何从计算机A 到 计算机B。
在这里插入图片描述

网络传输方式

面向有连接型
面向无连接型

面向无连接型

不要求 建立 和 断开 连接, 发送端 可以 任何时候 自由发送数据。
就像 村里 喇叭 开会,通知村民的方式。

不需要确认 对方端 是否存在, 就算不存在,发送端 也照常发送。
在这里插入图片描述

UDP User Datagtam Protocol
面向无连接
传输中,出现丢包,也不会重发
处理方式简单,只要不断发送就行

具备的特点:
包的总量少
视频,音频多媒体通信(即时通信)
限定LAN等特定网络
广播通信(广播,多播)

面向有连接型

发送数据前, 建立一条 连接通信线路(逻辑上)。
就像 两人 打电话,先确认对方,再发送消息。

在这里插入图片描述
TCP 只有在确认通信对方存在,才会发送数据。

在这里插入图片描述
TCP 协议
Transmission Control Protol
面向连接,基于字节流的 传输层 通信协议。

UDP 和 TCP 区别
TCP 提供 面向对象 可靠的数据量
TCP 传输 数据 ,无误差,不丢失,不重复,按序到达
TCP面向字节流
TCP连接为 点对点

UDP提供 非面向对象 不可靠的数据流
UDP最大努力交付,不保证一定可靠交付。
UDP面向报文
UDP支持 1对1,1对多,多对1,多对多,通信。

总结

面向无连接
两台计算机通信时,不需要建立连接,就可以进行数据的收发,数据可能会丢失。
传输协议:UDP
面向有连接
两台计算机通信时,需要先建立连接,再通信。
传输协议:TCP

socket-网络的控制单元

ip 相当于地址
端口号 相当于门牌号
传输方式 相当于 运输方式

socket 就好比是快递员。

在这里插入图片描述

socket 简称 套接字, 支持TCP/IP的网络通信的基本操作单元。

在这里插入图片描述

实现不同主机之间的 进程通信,网络上的各种服务大都是基于socket来完成的。
eg:
浏览网页,QQ聊天等。

创建socket

socket 基于 unix

在python中,有一个socket类,可以帮我们创建socket。

import socket
socket.soeckt(AddressFamily, Type)
AddressFmaily
选择 IPV4 还是IPV6
Type
流式 socket.for TCP
socket.SOCK_STREAM
数据报式 socket for UDP
socket.SOCK_RDM

第一步:导包
第二步:根据类 创建对象
第三步:通过socket对象 进行数据收 发
第四步: 关闭socket

下面是以UDP无连接为例子创建连接的例子:

'''
1 导入模块 socket
2 创建套接字,使用IPV4 UDP方式
3 数据传递
4 关闭套接字
'''

# UDP协议传输
# 1 导入模块 socket
import socket
# 2 创建套接字,使用IPV4 UDP方式
# socket.socket(协议类型,传输方式)
# 参数1:
# socket.AF_INET使用IPV4,socket.AF_INET6 使用IPV6
# 参数2:
# socket.SOCK_DGRAM 使用 UDP 无连接传输方式,socket.SOCK_STREAM 使用 TCP 有连接传输方式
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 3 数据传递

# 4 关闭套接字
udp_socket.close()

使用socket发送数据。
使用encode方法对发送的数据进行编码。

实现通信思路:
导入模块 socket
创建socket套接字
发送数据
关闭套接字

socket.socket 建立套接字
在这里插入图片描述socket.sendto 发送数据

在这里插入图片描述
socket.close 关闭套接字
在这里插入图片描述
encode 将字符串 转化为 二进制。

UDP 网络接受数据

socket的recvfrom方法 接受数据
decode 对接受到的数据 解码

核心方法
socke.recvfrom 接受UDP 套接字的大小
decode() 解码
在这里插入图片描述

接受数据代码部分
'''
1 导入模块 socket
2 创建套接字,使用IPV4 UDP方式
3 发送数据
4 接受数据(二进制)
5 将二进制 转换为字符串
6 输出显示接收到的内容
'''

# UDP协议传输
# 1 导入模块 socket
import socket
# 2 创建套接字,使用IPV4 UDP方式
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 3 发送数据
# 参数: 字符串编码为二进制,(接收方ip 接收方端口号)
udp_socket.sendto("约吗".encode(),("192.168.150.30",8080))
# 4 接受数据(二进制)
# 1)从套接字中 接受1024个字节的数据
# 2)此方法会造成 程序的阻塞,等待另外一台计算机发来的数据
    # 如果对方发数据了,recvfrom 会自动解除阻塞。
    # 如果对方没发送数据,会一直等待。
recv_data = udp_socket.recvfrom(1024)
# recv_data = (b'hello',('192.168.150.30',8080))
# 接收到的数据是一个元组, 接收到的数据是二进制,发送方的ip地址和端口号
# recv_data[0] 接收到的数据的二进制格式
# recv_data[1] 元组,对方的ip和端口
# 5 将二进制 转换为字符串
recv_text = recv_data[0].decode()
# recv_text = recv_data[0].decode("gbk") # 中文
# 6 输出显示接收到的内容
print("来自:", recv_data[1],"的消息:",recv_data[0])

整理思路

发送数据同之前
接受数据
recv_data = udp_socket.recvfrom(1024) # 每次接受1024个字节
recv_data 是一个元组
第一个元素 收到的数据的二进制格式
第二个元素 发送方的ip 和 端口号
把接受的数据的二进制格式进行解码
二进制数据.decode(“gbk”)

python3 编码转换

encode 和 decode 对字符串编码 和 解码

网络传输 是 以 二进制(字节码)的 方式 进行 传递的。

编码: str ——》 bytes
解码: bytes ——》 str

在这里插入图片描述
字符集 问题
gbk 和 utf8
国标码 和 万国码

编码 默认使用 utf8
但是 有时候解码错误 是需要转成gbk 才可以显示

# 5 将二进制 转换为字符串
# errors = 表示出现错误后,如何处理,默认为strict模式,解码失败会报错
# errors = "ignore" 解码失败之后,不报错 
recv_text = recv_data[0].decode(encoding='utf-8',errors="ignore")

解码
二进制.decode() 默认uft-8字符集
解码失败处理
decode(encoding=‘utf-8’,errors=“ignore”)
错误处理方式两种:
ignore 忽略
strict 报错

UDP 端口绑定

使用bind方法,在端口给套接字进行绑定
绑定端口 就是 固定端口号

核心方法
socket.bind(端口号)
在这里插入图片描述

'''
1 导入模块 socket
2 创建套接字,使用IPV4 UDP方式
3 绑定端口号
4 发送数据
5 接受数据(二进制)
6 将二进制 转换为字符串
7 输出显示接收到的内容
'''

# UDP协议传输
# 1 导入模块 socket
import socket
# 2 创建套接字,使用IPV4 UDP方式
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 3 绑定端口
# address 是一个元组,元组的第一个元素是字符串类型的ip地址,第二个元素是端口号(整数)

udp_socket.bind(("192.168.150.25",8888))# 写自己的端口号

# 4 发送数据
# 参数: 字符串编码为二进制,(接收方ip 接收方端口号)
udp_socket.sendto("hello".encode(),("192.168.150.30",8080))
# 5 接受数据(二进制)
# 1)从套接字中 接受1024个字节的数据
# 2)此方法会造成 程序的阻塞,等待另外一台计算机发来的数据
    # 如果对方发数据了,recvfrom 会自动解除阻塞。
    # 如果对方没发送数据,会一直等待。
recv_data = udp_socket.recvfrom(1024)
# recv_data = (b'hello',('192.168.150.30',8080))
# 接收到的数据是一个元组, 接收到的数据是二进制,发送方的ip地址和端口号
# recv_data[0] 接收到的数据的二进制格式
# recv_data[1] 元组,对方的ip和端口
# 6 将二进制 转换为字符串
# errors = 表示出现错误后,如何处理,默认为strict模式,解码失败会报错
# errors = "ignore" 解码失败之后,不报错
recv_text = recv_data[0].decode(encoding='utf-8',errors="ignore")
# recv_text = recv_data[0].decode("gbk") # 中文
# 7 输出显示接收到的内容
print("来自:", recv_data[1],"的消息:",recv_data[0])

接受端 绑定端口

上面是在 发送端 绑定端口
这次 是 在 接受端 绑定端口
在这里插入图片描述

'''
1 导入模块 socket
2 创建套接字,使用IPV4 UDP方式
3 绑定端口号(发送端)
4 接受数据(二进制)
5 解码数据 将二进制 转换为字符串
6 输出显示接收到的内容
'''

# 1 导入模块 socket
import socket
# 2 创建套接字,使用IPV4 UDP方式
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 3 绑定端口号(发送端)
# 写自己的ip地址 和 端口号
# udp_socket.bind(("192.168.150.25",6666)) 
#  这里的ip地址尽可能写为空,因为一个计算机可能有多个网卡
udp_socket.bind(("",6666))
4 接受数据(二进制)、
# 1024表示接受 缓冲区大小(每次接受1024个字节)
recv_data, ip_port = udp_socket.recvfrom(1024) # 返回的结果是一个元组
# a,b = (1,2) 解包
# a=1 b b=2
# 5 解码数据 将二进制 转换为字符串

# 6 输出显示接收到的内容
print("接受[%s]的信息:%s" % (str(ip_port),recv_data.decode()))

# 7 关闭套接字
udp_socket.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值