# 网络编程
- 网络:网线、电脑、服务器
- 网络协议:一套规则
- 网络模型
- 七层模型(理论模型,七层协议)
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示成
- 应用层
- 四层模型(实际应用)
- 链路层
- 网络层
- 传输层
- 应用层
- 每一层都有相应的协议负责交换信息或者协同工作
- TCP/IP 协议族
- IP地址:负责在网络上唯一定位一个机器
- IP地址分ABCDE类
- 是由四个数字段组成,每个数字段的取值是0-255
- 192.168.xxx.xxx:局域网ip
- 127.0.0.1:本机器
- IPv4, IPv6
- 端口
- 范围:0-65535
- 知名端口:0-1023
- 非知名端口:1024-
# TCP/UDP协议
- UDP:非安全的、不面向连接的传输
- 安全性差
- 大小限制64kb
- 没有顺序
- 速度快
- TCP:基于连接的通信,安全的,速度慢
- SOCKET编程
- socket(套接字):是一个网络通信的端点,能实现不同主机的进程通信,网络大多基于socket通信
- 通过IP+端口定位对方并发送消息的通信机制
- 分为UDP和TCP,即时通信一般用UDP
- 客户端Client:发起访问的一方
- 服务器端Server:接受访问的一方
- UDP编程
- Server端流程
1、建立socket,socket是负责具体通信的一个实例
2、绑定,为创建的socket指定固定的端口和ip地址
3、接受对方发送的内容
4、给对方发送反馈,此步骤为非必须
- Client端流程
1、建立通信的socket
2、发送内容到指定服务器
3、接受服务器给定的反馈内容
- 服务器端案例v01.py
- 客户端案例v02.py
- 服务器程序要求永久运行,一般用死循环处理
- 改造的服务器版本v03.py
- TCP编程
- 面向链接的传输,即每次传输之前需要先建议一个链接
- 客户端和服务器端两个程序需要编写
- Server端的编写流程
1、建立socket负责具体通信,这个socket其实只负责接收对方的请求
2、绑定端口和地址
3、监听接入的访问socket
4、接受访问的socket,可以理解接受访问即建立了一个通讯的链接通路
5、接受对方的发送内容,利用接收到的socket接收内容
6、如果有必要,给对方发送反馈消息
7、关闭链接通路
案例v04.py
- Client端流程
1、建立通信socket
2、链接对方,请求跟对方建立通路
3、发送内容到对方服务器
4、接受对方的反馈
5、关闭链接通路
案例v05.py
# FTP编程
- FTP(FileTransferProtocal)文件传输协议
- 用途:定制一些特殊的上传下载文件的服务
- 用户分类:登陆FTP服务器必须有一个账号
- Real账户:注册账户
- Guest账户:可以临时对某一类人的行为进行授权
- Anonymous账户:匿名账户,允许任何人
- FTP的工作流程
1、客户端链接远程主机上的FTP服务器
2、客户端输入用户名和密码(或者"anonymous"和电子邮件地址)
3、客户端和服务器进行各种文件传输和信息查询操作
4、客户端从远程FTP服务器退出,结束传输
- FTP文件表示
- 分三段表示FTP服务器上的文件
1、HOST:主机地址,类似于ftp.mozilla.org,以ftp开头
2、DIR:目录,表示文件所在本地的路径,例如pub/android/focus
3、File:文件名称,例如Klar-1.1-RC1.apk
- 如果想完整精确的表示ftp上某一个文件,需要上述三部分组合在一起
# FTP案例如下:
import ftplib
import os
import socket
# 三部分精确表示FTP文件,好多公开的FTP服务器访问会出错或没反应
HOST = "ftp.acc.umu.se"
DIR = 'Public/EFLIB'
FILE = 'README'
# 1、客户端链接远程主机上的FTP服务器
try:
f = ftplib.FTP()
# 通过设置调试级别可以方便调试
f.set_debuglevel(2)
# 链接主机地址
f.connect(HOST)
except Exception as e:
print(e)
exit()
print("***Connected to host {0}".format(HOST))
# 2、客户端输入用户名和密码(或者"anonymouse"和电子邮件地址)
try:
# 登陆如果没有输入用户信息,则默认使用匿名登陆
f.login()
except Exception as e:
print(e)
exit()
print("***Logged in as 'anonymouse'")
# 3、客户端和服务器进行各种文件传输和信息查询操作
try:
# 更改当前目录到指定目录
f.cwd(DIR)
except Exception as e:
print(e)
exit()
print("*** Changed dir to {0}".format(DIR))
try:
# 从FTP服务器下载文件,第一个参数是ftp命令,第二个参数是回调函数
# 此函数的意思是,执行RETR命令,下载文件到本地后,运行回调函数将内容写入本地README里
f.retrbinary('RETR {0}'.format(FILE), open(FILE, 'wb').write)
except Exception as e:
print(e)
exit()
# 4、客户端从远程FTP服务器退出,结束传输
f.quit()
'''
控制台打印输出如下:
Connected to pydev debugger (build 182.4129.34)
*get* '220 Please use http://ftp.acc.umu.se/ whenever possible.
'
*resp* '220 Please use http://ftp.acc.umu.se/ whenever possible.'
***Connected to host ftp.acc.umu.se
*cmd* 'USER anonymous'
*put* 'USER anonymous
'
*get* '331 Please specify the password.
'
*resp* '331 Please specify the password.'
*cmd* 'PASS **********'
*put* 'PASS **********
'
*get* '230 Login successful.
'
*resp* '230 Login successful.'
***Logged in as 'anonymouse'
*cmd* 'CWD Public/EFLIB'
*put* 'CWD Public/EFLIB
'
*get* '250 Directory successfully changed.
'
*resp* '250 Directory successfully changed.'
*** Changed dir to Public/EFLIB
*cmd* 'TYPE I'
*put* 'TYPE I
'
*get* '200 Switching to Binary mode.
'
*resp* '200 Switching to Binary mode.'
*cmd* 'PASV'
*put* 'PASV
'
*get* '227 Entering Passive Mode (194,71,11,165,63,139).
'
*resp* '227 Entering Passive Mode (194,71,11,165,63,139).'
*cmd* 'RETR README'
*put* 'RETR README
'
*get* '150 Opening BINARY mode data connection for README (6122 bytes).
'
*resp* '150 Opening BINARY mode data connection for README (6122 bytes).'
*get* '226 Transfer complete.
'
*resp* '226 Transfer complete.'
*cmd* 'QUIT'
*put* 'QUIT
'
*get* '221 Goodbye.
'
*resp* '221 Goodbye.'
'''