一.TCP协议的处理方式
1.tcp协议是一种面向连接,保证数据传输的高可靠性的,一对一的传输层协议
2.高可靠性,通过三次通信握手来确保建立可靠的连接,保证数据包的数据和顺序不会丢失和错乱
通过四次挥手来确定断开连接
3.用python提供的socket模块(套接字)
socket():socket模块中的socket()对象,可以用于创建套接字:socket(family, type)
参数family:连接的IP地址类型,socket.AF_INET表示的是IPv4的地址,
socket.AF_INET6表示的是IPv6的地址
参数type:连接数据传输类型,使用socket.SOCK_STREAM表示使用流协议(TCP)
返回值:一旦创建成功,返回一个套接字对象,姑且命名为sc
bind():用于将套接字和主机IP以及端口号Port进行绑定,就是上面例图中将网线插到电脑上
bind()是socket对象的方法,可以直接通过socket对象调用
bind()方法只接受一个元组类型的参数,将ip地址和端口填写进去即可
sc.bind(("192.168.1.1", 8080))
listener(count):监听连接的方法,一般在服务端编程中使用,
调用socket对象的listener()方法,就会让服务器程序处于等待客户端连接
参数count:一个整数数据,表示允许最大的连接数量
accept():接收客户端的连接,这是一个阻塞方法,一旦程序执行到accept()方法,
就会处于等待状态不继续执行,一直到有客户端连接进来才会继续执行程序
recv():用于接收远程套接字对象发送的数据
返回值:远程套接字发送的数据
sendall(data):用于向远程主机发送数据
参数data:用于发送的数据
close():套接字的关闭方法,通信完毕之后,一定要记得关闭和服务器之间的TCP连接,释放资源。
二 网络
用于进行 运算的数据的共享需求变得更加迫切,于是有人通过物理线路将多台计算机连接起来组成
一个互联计算机平台,实现了多台计算机之间特定的数据交互模式,这就是最早期的网络和它的意义!
三 IP
1.ip: internet protocal 网络互联协议(因特网地址寻址协议),中文缩写:网协
网络互联协议就是为了多台计算机能够在网络中进行网络互联通信而设计的协议,
是能够使 得网络上工作的任意一台计算机可以和其他计算机计算机之间实现网络通信的一套通用规 则,
任何计算机制造厂商生产的计算机必须遵守这套规则的情况下,就可以接入现行的网络 实现联网通信的功能!
2.ip地址根据使用的用户性质的不同,主要区分为5类IP地址
A类:地址范围从1.0.0.0 到126.0.0.0
B类:地址范围从128.0.0.0到191.255.255.255
C类:范围从 192.0.0.0 到 223.255.255.255
D类:。范围从 224.0.0.0 到 239.255.255.255
E类:。范围从 240.0.0.0 到 255.255.255.254
255.255.255.255 用于广播地址
全零(“0.0.0.0”)地址对应于当前主机。
全“1”的 IP 地址(“255.255.255.255”)是 当前子网的广播地址
四 端口
端口 port 主要是用于区别不同的软件的通信 渠道,
用于正确的将数据通过指定的端口渠道传输给对应的软件!
计算机中的端口号的范围是 0~65535 之间
端口号根据其使用场景,一般区分为公用端口、动态端口、保留端口
公用端口:0~1023 动态端口:1024~65535
保留端口:一般是 unix 系统中超级用户进程分配保留端口号
五 协议
什么是协议
协议:英文名称 protocal,是多方协商计议之后得出的约定、规则、规范
通常情况下为了让工作在网络中的多台计算机之间能友好的完成不同软件的数据的通信,
出现了互联网数据传输协议的概念,通过协议的约束,不同地域环境的计算机可以通过网络完
成流畅的正确的数据交互。
计算机网络数据传输协议目前最主流的就是欧洲计算机制造协会联盟,
也称为国际标准化组 织 ISO 指定的 OSI/RM 七层网络传输模型!
python2.x/python3.x对于网络编程的支持都是非常友好的,本身支持两部分非常有用的网络编程方式
1 传统网络编程
2 非阻塞异步网络编程
底层通过socket对象的连接,完成多种协议的网络程序服务端/客户端的开发和数据通信
socket 是一种计算机网络数据结构,中文译名:套接字
socket 套接字 又称:数据传输协议
面向连接的套接字 确定可靠的连接,确认后开始连接发送
面向无连接的套接字 短连接的 一旦接收,断开连接,数据丢了不负责
socket的基本语法结构
socket.socket(socket_family, socket_type, protocal=0)
socket_family: socket 地址家族, AF_UNIX/AF_LOCAL 或者 AF_INET
socket_type: socket 连接类型
面向连接的(SOCK_STREAM),面向无连接的(SOCK_DGRAME)
protocal:传输协议,一般不用设置,使用默认值进行自动匹配就好
创建 TCP 协议的套接字 socket 对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
创建 UDP 协议的套接字 socket 对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
UDP编程
UDP:用户数据报协议
是osi/RM模型中隶属于传输层的面向无连接的网络数据传输协议,UDP协议本身没有连接可靠性的保证,没有数据顺序ACK的记录,没有数据重发等机制,因为没有那么多的数据传输控制特性,所以UDP进行数据传输过程中延迟较小,数据传输效率较高,比较适合对可靠性要求不是很高的程序
由于UDP面向无连接的特性,在编程处理的过程中,服务端和客户端的操作模式类似唯一的区别就是服务端需要主动等待客户端发送消息,要将自己的AF暴露给客户端操作
1 服务端开发
TCP/UDP服务端开发步骤
->引入依赖的模块
->定义服务器描述信息
->创建TCP/UDP套接字对象并绑定主机
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
->消息循环:和连接进入的客户端之间发送/收取消息
->关闭套接字
2 客户端开发
->引入依赖的模块
->定义服务器描述信息
->创建TCP/UDP套接字对象
->消息循环
->发送接收消息
->关闭套接字
->socketserver<面向对象开发>
self.request.send
self.request.recv
socketserver是python中提供的一个可以用于面向对象服务端开发的一个高级模块,封装了底层socket的大量操作实现,通过提供面向对象的操作方式简化程序开发
socketserver下的TCP编程
->导入socketserver模块 ->import socketserver 导入需要的各种方法
->定义自定义请求处理类
->请求处理方法(发送消息/处理消息)
->测试
->启动服务器
tcp_server.serve_forever()
#引入socketserver
from socketserver import (TCPServer as TCP,StreamRequestHandler as SRH)
#自定义请求处理类型
class MyRequestHandler(SRH):
#重写请求处理方法
def handle(self):
#父类中:请求对象:self.request
print("一个客户端连接上来了",self.client_address)
#发送消息
self.request.send("my name is happy".encode("utf-8"))
#接收消息
info = self.request.recv(1024)
print(info.decode("utf-8"))
#测试
if __name__ == "__main__":
ADDRESS = ("",8899)
#创建一个TCP服务器
tcp_server = TCP(ADDRESS,MyRequestHandler)
print("server is starting,waiting for connect...")
#启动服务器
tcp_server.serve_forever()
网友评论