Python-网络编程

描述

网络通信基本概述

  • 网络是什么?
    • 网络就是辅助双方或多方连接在一起的工具
  • 使用网络的目的?
    • 使连接网络的多方,能进行数据传递
  • 网络编程是什么?
    • 就是让在不同电脑上的软件能进行数据传递
  • IP地址是什么?
    • 用来在网络中标记一台电脑,比如:192.168.1.1;在本地局域网内是唯一的
  • 查看本机ip地址
    • 在dos命令窗口中,输入:ipconfig
    • 辅助
  • 什么是端口?
    • 端口是通过端口号来标记的,范围是从 0~65535
    • 知名端口
      • 众所周知的端口号,范围 0~1023,例如:80端口是http的,21端口是ftp用的
      • 一般情况下,程序要使用知名端口是需要管理员权限的
    • 动态端口
      • 动态端口一般不固定,是动态分配的,范围从 1024~65535
      • 动态分配是指,当一个程序需要网络通信时,它向主机申请一个端口,主机从可用的端口中分配一个供它使用,当这个程序关闭时,同时会释放占用的端口
    • 可以在命令窗口中输入:** netstat -ano **查看端口状态

socket概述

  • 什么是socket?
    • socket 简称 套接字 ,是进程间通信的一种方式,它与其它进程间通信的一个主要不同是:它能实现不同主机间的通信,例如:QQ、微信等
  • 在Python中,使用socket 模块的函数 socket 来创建通信

语法

import socket
socket.socket(family,type)

参数说明

  • **family: **可以选择 AF_INET(用于Internet 进程间通信) 或者 AF_UNIX (用于另一台机器进程间通信),实际工作中常用AF_INET
  • Type: 套接字类型,可以是SOCK_STREAM(流式套接字,主要用于TCP协议) 或者 SOCK_DGRAM(数据报套接字,主要用于UDP协议)

**说明

**

  • 套接字使用流程与文件使用流程类似
    • 创建套接字
    • 使用套接字收/发数据
    • 关闭套接字

示例

import socket
# 创建TCP的套接字 (点对点)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)


# 发送或者接收信息 ...


# 关闭套接字
s.close()


# 创建UDP的套接字 (一对多,广播形式)
s2=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)


# 发送或者接收信息 ...


# 关闭套接字
s2.close()

UDP协议

  • 介绍
    • 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议
    • UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送
  • 优点
    • 传输速度快
    • 有效传输的数据量最多为500bytes
  • 缺点
  • 发送数据,无需对方确认(不可靠)
  • 容易丢包
  • 应用场景
    • UDP广泛应用于需要相互传输数据的网络应用中,如QQ使用的就是UDP协议
    • 在局域网中,如果要想局域网内所有计算机发送数据,可以使用广播,广播不能用TCP实现,可以用UDP实现

**示例

**

**客户端

**

import socket


# 创建UDP的套接字
udpSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#  允许套接口传送广播信息,当option_value不等于0时,允许,否则,禁止
udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)


port=33333
# ip 为广播形式,也可以用255.255.255.25 表示全局域网都可以接收
network=''
# 发送广播数据
udpSocket.sendto("我在发送数据!!".encode("utf-8"),(network,port))


# 关闭
udpSocket.close()

服务端

import socket


# 创建UDP的套接字
udpSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#  允许套接口传送广播信息
udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)


port=33333
# 绑定ip和端口,本机ip可以不写
udpSocket.bind(('',port))


# 等待接收方发送数据,1024表示本次接收的最大字节数
data,address=udpSocket.recvfrom(1024)
print("接收到的数据是:%s,地址是:%s"%(data.decode("utf-8"),str(address)))


# 关闭
udpSocket.close()

TCP协议

  • 介绍
    • TCP协议,是一种传输控制协议,是一种面向连接的,可靠的,基于字节流的传输层控制协议,由IETF的RFC 793定义
    • TCP是一种点对点的传输方式
    • TCP协议编写的三个步骤:创建连接、数据传递、关闭连接
    • TCP 通信模型中,在通信开始之前,一定要先建立相关的连接,才能发送数据
  • 优点
    • 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接
    • 在数据传递时,有确认、重传、拥塞控制机制
    • 在数据传完后,会断开连接用来节约系统资源
  • 缺点
    • 慢,效率低,占用系统资源高
    • 易被攻击,TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击

TCP与UDP的区别

  • 面向连接
    • TCP面向连接(如打电话要先拨号建立连接)
    • UDP是无连接的,即发送数据之前不需要建立连接
  • 可靠
    • TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达
    • UDP尽最大努力交付,不需要对方确认,即不保证可靠交付
  • 字节流
    • TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流
    • UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
  • 连接性
    • TCP连接只能是点到点的
    • UDP支持一对一,一对多,多对一和多对多的交互通信
  • 首部开销
    • TCP首部开销20字节
    • UDP首部开销小,只有8个字节
  • 信道
    • TCP的逻辑通信信道是全双工的可靠信道
    • UDP则是不可靠信道

示例

服务端

import socket


# 创建tcp 的套接字
tcp_socekt=socket.socket(socket.AF_INET,socket.SOCK_STREAM)


# ip与端口,本机ip可以不写
addr=('',44444)
# 绑定地址
tcp_socekt.bind(addr)


# 使用socket创建的套接字默认的属性是 主动的,使用 listen 将其变为被动,这样就可以接收别人的连接了, 128表示允许的最大连接数
tcp_socekt.listen(128)


# 如果有一个新的客户端来连接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket 用来为这个客户端服务
# tcp_socket 就可以用来专门等待其他新客户端的链接
client_socket,client_addr=tcp_socekt.accept()


# 接收对方发过来的数据
data=client_socket.recv(1024)
print("接收到的数据是:%s,地址是:%s"%(data.decode("utf-8"),str(client_addr)))


# 发送数据到客户端
client_socket.send("hello....".encode("utf-8"))


# 关闭为这个客户端服务的套接字,一旦关闭,就意味着不能再为这个客户端服务了
client_socket.close()


# 关闭外面总的 套接字,一旦关闭,则意味着不再接收任何连接了
tcp_socekt.close()

客户端

import socket


# 创建tcp 套接字
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)


# 目标服务器地址
dest_addr=("127.0.0.1",44444)


# 连接目标服务器
tcp_socket.connect(dest_addr)


# 发送数据
tcp_socket.send("我是客户端".encode("utf-8"))


# 接收对方发过来的数据,最大接收1024个字节
data=tcp_socket.recv(1024)
print("接收到的数据是:%s"%data.decode("utf-8"))


# 关闭套接字
tcp_socket.close()
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分