虚拟环境
可以让两个不同的项目(运行环境不同)同时在一个服务器上面执行。
多个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()