Python之网络编程 UDP/TCP/ FTP

网络编程

  • 网络:
  • 网络协议:一套规则
  • 网络模型: 
    • 七层模型 
      • 物理层:网线,水晶头等
      • 数据链路层:
      • 网络层
      • 传输层
      • 会话层
      • 表示层
      • 应用层
    • 四层模型- 时间应用 
      • 链路层
      • 网络
      • 传输层
      • 应用层
  • 每一层都有相应的协议负责交换信息或者协同工作
  • TCP/IP协议族
  • IP地址:负责在网路上唯一定位一个机器 
    • IP地址分ABCDE类
    • 是由四个数字段组成,每个数字段的取值是0~255
    • 192.168.xxx.xxx:局域网IP
    • 127.0.0.1:本机
    • IPv4,IPv6
  • 端口 
    • 范围:0-65535
    • 知名端口: 0-1023
    • 非知名端口:1024-65535

TCP/UDP协议

  • UDP协议:非安全的面向链接的传输 
    • 安全性差
    • 大小限制64kb
    • 没有顺序
    • 速度快
  • TCP 
    • 基于链接的通信
  • SOCKET编程

    • socket(套接字):是一个网络通信的端点,能实现不同主机的进程通信。
    • 通过IP+端口定位对方发送消息的通信机制
    • 分为UDP和TCP
    • 客户端Client:发起访问的一方
    • 服务器端Server:接受访问的一方

       

  • UDP编程

    • Server端流程
      1. 建立socket,socket是负责具体通信的一个实例 
      2. 绑定,为创建的socket指派固定的端口和ip地址
      3. 接受对方发送的内容
      4. 给对方发送反馈,此步骤为非必须步骤
    • Client端流程 
      1. 建立通信的socket
      2. 发送内容到指定服务器
      3. 接受服务器给定的反馈内容
      4. (服务器程序要求永久运行,一般用死循环处理)
# -*- coding:utf-8 -*-
"""
Server段流程
1、建立socket
2、
3、
4、
"""

import socket


def serverFunc():
    # 1、建立socket
    # socket.AF_INET :使用IPv4协议族
    # socket.SOCK_DGRAM: 使用UDP通信
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 2、绑定IP的端口
    # 地址是一个tuple类
    address = ("127.0.0.1", 8989)
    sock.bind(address)

    # 3\接收对方消息
    # 等待方式为死等
    # recvfrom接收的返回值是一个tuple,前一项表示数据,后一项表示地址
    # 参数的含义是缓冲区大小

    data, address = sock.recvfrom(500)

    print(data)
    print(type(data))

    # 4\发送过来的数据是bytes格式,必须通过解码才能得到str格式
    # decode默认解码格式utf-8
    text = data.decode()

    print(text)
    print(type(text))

    # 返回消息

    req = "I am not wtt"

    # 发送消息 默认编码utf-8
    data = req.encode()

    sock.sendto(data, address)


if __name__ == '__main__':
    print("Starting Server ....")
    serverFunc()
    print("Start SUEESS!")
Starting Server ....
# -*- coding:utf-8 -*-

import socket


def clientFunc():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    text = "I LOve wtt"

    data = text.encode()

    sock.sendto(data, ('127.0.0.1', 8989))

    data, address = sock.recvfrom(200)

    data = data.decode()

    print(data)


if __name__ == '__main__':
    clientFunc()

TCP编程

  • 面向链接的传输,即每次传输之前需要建立一个链接
  • 客户端和服务端两个程序需要编写
  • Server端编写流程

    • 1、建立socket负责具体通信,这个socket其实只负责接受对方的请求
    • 2、绑定IP和端口
    • 3、监听接入的访问socket
    • 4、接收访问的socket,可以理解接收访问即建立一个通讯的链接通路
    • 5、 接收对方的发送内容,利用接收到的socket接收内容
    • 6、如果有必要,给对方发送返回信息
    • 7、关闭链接通路
  • Client端编程

    • 1、建立通信socket
    • 2、链接对方,请求跟对方建立通路
    • 3、发送内容到对方服务器
    • 4、接收对方的反馈
    • 5、关闭链接通路
# -*- coding:utf-8 -*-
"""
Server段流程
"""

import socket


def serverFunc():
    # 1、建立socket
    # socket.AF_INET :使用IPv4协议族
    # socket.SOCK_DGRAM: 使用UDP通信
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2、绑定IP的端口
    # 地址是一个tuple类
    address = ("127.0.0.1", 8989)
    sock.bind(address)

    # 3、监听接入的访问socket
    sock.listen()

    while True:
        # 4、接收访问的socket
        # accept 返回的元祖第一个元素赋值给skt,第二个赋值给address
        skt, address = sock.accept()
        # 5、接收对方发送的消息,利用socket接收内容
        # 500代表接收使用的buffersize
        msg = skt.recv(500)
        # 接收到的是bytes格式内容
        # 想得到str格式的,需要进行解码
        msg = msg.decode()

        rst = "Received msg:{0} from {1}".format(msg, address)

        print(rst)

        # 6、如果有必要,给对方发送返回消息

        skt.send(rst.encode())
        # 7、关闭链接

        skt.close()


if __name__ == '__main__':
    print("Starting Server ....")
    serverFunc()
    print("Start SUEESS!")
# -*- coding:utf-8 -*-

import socket

def tcp_clt():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    address = ('127.0.0.1', 8989)

    sock.connect(address)

    msg = "djksajdaskd你撒的d"

    sock.send(msg.encode())

    ret = sock.recv(500)

    print(ret.decode())

    sock.close()


if __name__ == '__main__':
    tcp_clt()

FTP编程

  • FTP(File Transfer Protocal)文件传输协议
  • 用途:定制一些特殊的上传下载文件的服务
  • 用户分类:登录FTP服务器必须有一个账号
    • Real账户:注册账户
    • Guest账户:可能临时对某一类人的行为进行授权
    • Anonymous账户:匿名账户,允许任何人 
  •  FTP工作流程 
  1. 客户端连接远程主机上的FTP服务器 
  2. 客户端输入用户名和密码(或者“Anonymous”和电子邮件地址)
  3. 客户端和服务器进行各种文件传输和信息查询操作
  4. 客户端从远程FTP服务器退出,结束传输
  • FTP文件表示 
  1. 分三段表示FTP服务器上的文件
    1. HOST:主机地址,类似于ftp.mozilla.org,以ftp开头
    2. OIR:目录,表示文件所在本地的路径
    3. File:文件名称
    4. 如果想完整精确的表示ftp上某一个文件,需要上述三部分组合在一起
#导入相应的包,主要是ftplib
import ftplib#关于ftp的操作都在这个包里面
import oss
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.客户端输入用户和密码(或者“anonymous”和电子邮件地址)
try:
    #更改当前目录到指定目录
    f.cwd(DIR)
except Exception as e:
    print(e)
    exit()
print("Connected dir to {0}".format(DIR))

try:
    #从ftp服务器上下载文件
    #第一个参数是ftp命令
    #第二个参数是回调函数
    #此函数的意思是,执行RETR命令,下载文件到本地后,运行回调函数
    f.retrbinary('RETR {0}'.format(FILE), open(FILE, 'wb').write)
except Exception as e:
    print(e)
    exit()
#4.客户端从远程ftp服务器退出,结束传输
f.quit()

 

 

 

 

发布了36 篇原创文章 · 获赞 24 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章