Python网络编程

大拿老师的Python笔记

网络编程

  • 网络协议 : 一套规则

  • 网络模型:

    • 七层模型
      • 物理层
      • 数据链路层
      • 网络层
      • 传输层
      • 会话层
      • 表示层
      • 应用层
    • 四层模型 - 实际应用
      • 链路层
      • 网络
      • 传输层
      • 应用层
  • 每一层都有相应的协议负责交换信息或者协同工作

  • TCP/TP 协议族

  • 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(套接字):是一个网络通信的端点,能实现不同主机的进程通信

  • 通过IP+端口定位对方并发送消息的通信机制

  • 分为UDP和TCP

    • 即时通信一般用UDP,因为少而且快,信息也许不太重要。
  • 客户端Client : 发起访问的一方

  • 服务器端Server : 接受访问的一方

  • UDP编程

    • Server端流程

      • 1.建立socket,socket是负责具体通信的一个实例
      • 2.绑定,为创建的socket指派固定的端口和ip地址
      • 3.接收对方发送内容
      • 4.给对方发送反馈,此步骤为非必须步骤
    • Client端流程

      • 1.建立通信的socket
      • 2.发送内容到指定服务器
      • 3.接收服务器给定的反馈内容
        案例

注意,要先启动服务器端,端口使用完后不一定马上空闲,即不会马上归还。

服务器端

# socket模块负责socket编程
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和port
    # 127.0.0.1 : 这个ip地址代表的是机器本身
    # 端口 7852:随手指定的端口号
    # 地址是一个tuple类型, (ip,port)
    addr = ("127.0.0.1", 7852)
    sock.bind(addr)

    # 3.接受对方的消息
    # 等待方式为死等, 没有其他可能性
    # recvfrom接受的返回值是一个tuple, 前一项表示数据(消息), 后一项表示地址
    # rst = sock.recvfrom(500), 500是缓冲区
    data, addr = sock.recvfrom(500)
    print(data)
    print(type(data))
    # 发送过来的数据是bytes格式, 必须通过解码才能得到str格式内容
    # decode 默认参数是utf8
    text = data.decode()
    print(type(text))
    print(text)

    # 4.反馈给对方的消息
    rsp = "Ich hab keine Hunge"
    # 发送的数据需要编码成bytes格式
    # 默认是utf8 , 注意编码和解码要一致 , 否则会看不到
    data = rsp.encode()
    # sendto是UTP协议的函数
    sock.sendto(data, addr)  # 发送消息


if __name__ == '__main__':
    print('String server ......')
    serverFunc()
    print('Ending server ......')

客户端

import socket


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

    text = "I Love jingjing"

    # 发送的数据必须是bytes格式
    data = text.encode()

    # 发送 , 会自动绑定地址
    sock.sendto(data, ("127.0.0.1", 7852))

    # 接受
    data, addr = sock.recvfrom(200)  # 缓冲区

    text = data.decode()  # 解码

    print(text)


if __name__ == '__main__':
    clientFunc()

可以改成死循环,可以永久运行

TCP编程

  • 面向链接的传输,即每次传输之前需要先建立一个链接

  • 客户端和服务器端两个程序需要编写

  • Server端的编写流程

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

    • 1.建立通信socket
    • 2.链接对方,请求跟对方建立通路
    • 3.发送内容到对方服务器
    • 4.接收对方的反馈
    • 5.关闭链接通路

服务器端

import socket


def tcp_srv():
    # 1.建立socker负责具体通信,这个socker其实只负责接收对方的请求,真正通信的是链接后
    # 需要用到两个参数
    # AF_INET : 含义同UDP一致
    # SOCK_STREAM:表明使用TCP进行通信
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2.绑定端口和地址
    # 此地址是一个元组类型内容,第一部分为字符串,代表ip,第二部分为端口号
    addr = ("127.0.0.1",8998)
    sock.bind(addr)

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

    while True:
        # 4.接受访问的socket, 可以理解为接受访问即建立了一个通讯的链接通路
        # accept返回的元组第一个元素赋值给skt,第二个赋值给addr
        skt, addr = sock.accept()

        # 5.接受对方的发送内容, 利用接受到的socket接受内容
        # 500代表使用的buffersize
        # msg = skt.receive(500)
        msg = skt.recv(500)
        # 接受到的是bytes格式内容
        # 想得到str格式的 , 需要进行解码
        msg = msg.decode()
        rst = "Received msg:{} from {}".format(msg,addr)
        print(rst)

        # 6.如果有必要, 给对方发送反馈信息
        skt.send(rst.encode())

        # 7.关闭链接通路, 可以全部接受之后再关闭, 可以节省资源
        skt.close()


if __name__ == '__main__':
    print('Starting tcp server...')
    tcp_srv()
    print('Ending tcp server...')

客户端

import socket

def tcp_clt():
    # 1.建立通信socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.链接对方, 请求跟对方建立通路
    addr = ("127.0.0.1",8998)
    sock.connect(addr)
    # 3.发送内容到对方服务器
    msg = 'I love wangxiaojing'
    sock.send(msg.encode())
    # 4.接受对方的反馈
    rst = sock.recv(500)
    print(rst.decode())
    # 5.关闭链接通路
    sock.close()


if __name__ == '__main__':
    tcp_clt()

FTP编程

  • FTP(FileTransferProtocal)文件传输协议
  • 用途 : 定制一些特殊的上传下载的服务
  • 用户分类 : 登陆FTP服务器必须有一个账号
    • Real账户 : 注册账户
    • Guest账户 : 可能临时对某一类人的行为进行授权
    • Anonymous :匿名账户,允许任何人
  • FTP工作流程
    • 1.客户端链接远程主机上的FTP服务器
    • 2.客户端输入用户名和密码(或者“anonymous”和电子邮件地址)
    • 3.客户端和服务器进行各种文件传输和信息查询操作
    • 4.客户端从远程FTP服务器退出,结束传输
  • FTP文件表示
    • 分三段表示FTP服务器上的文件
    • HOST : 主机地址,类似于ftp.mozilla.org,以ftp开头
    • DIR : 目录,表示文件所在本地的路径,例如 pub/android/focus/1.1-f
    • File : 文件名称 , 例如Klar-1.1-RC1.apk
    • 如果想完整精确表示ftp上某一个文件,需要上述三部分组合在一起

案例

# 需要导入相应包 , 主要是ftplib
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{}".format(HOST))


# 2.客户端输入用户名和密码(或者“anonymous”和电子邮件地址)
try:
    # 登录如果没有输入用户信息, 则默认使用匿名登录
    f.login()
except Exception as e:
    print(e)
    exit()
print("***Logged in as 'anonymous'")

# 3.客户端和服务器进行各种文件传输和信息查询的操作
try:
    # 更改当前目录到指定目录
    f.cwd(DIR)
except Exception as e:
    print(e)
    exit()
print("*** Changes dit to".format(DIR))

try:
    # 从FTP服务器上下载文件
    # 第一个参数是ftp命令
    # 第二个参数的回调函数
    # 此函数的意思是, 实心RETR命令, 下载文件到本地后, 运行回调函数
    f.retrbinary("RETR{}".format(FILE),open(FILE,'wb').write)
except Exception as e:
    print(e)
    exit()

# 4.客户端从远程ETP服务器退出, 结束传输
f.quit()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值