socket模块--TCP和UDP协议下的基础网络通话

1、什么是socket:python

 

套接字socket: 在python中就是一个模块, socket是在应用层与传输层中间的抽象层. socket就像是一个接口,经过这个接口能够实现网络通讯. 
它把复杂的TCP/IP协议族隐藏在Socket接口后面,socket屏蔽了各个协议的通讯细节,使得程序员无需关注协议自己,直接使用socket提供的接口来进行互联的不一样主机间的进程的通讯。

 socket根据用途,有两种分类:ios

1)基于文件类型的套接字家族:AF_UNIX, 基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,能够经过访问同一个文件系统间接完成通讯 2)基于网络类型的套接字家族(AF_INET):网络编程就是用的 AF_INET

 

osi七层模型:  互联网的核心就是由一堆协议组成,协议就是标准,标准就是你们都承认的,下面的图是数据经过网络沟通通过的底层细节.主要记住五层就够了程序员

 

 socket 在网络流程中的位置:应用层与传输层之间编程

 

简述访问Jd网站流程浏览器

个人计算机首先提交访问某域名的请求,经过dns服务器(有一个字典,域名对应着IP)它将域名转化成ip地址返回给个人计算机
个人计算机经过ip协议和子网掩码判断出不在一个局域网后,提交给交换机,而后交换机提交给路由器,路由器带着的源ip地址和源mac地址以及目标的源ip地址和端口,经过nat技术将个人计算机虚拟IP(局域网IP)转换成公网IP,在通过路由协议,优化出最短的访问路径,访问到对应的路由器上的,而后对应的路由器经过端口映射技术访问到目标IP的端口上.(内网的IP,由于是虚拟的,因此外部是访问不到的,只能访问到公网IP,像Jd类的大公司,都会买一个公网IP,因此咱们才能直接访问到)

 

2、基于TCP和UDP两个协议下的socket的通信流程缓存

什么是TCP: 可靠的、面向链接的协议,传输效率低全双工通讯(发送缓存&接收缓存)、面向字节流. 好比:Web浏览器,文件传输程序。服务器

什么是UDP:不可靠的、面向无链接的服务,传输效率高(发送前时延小),既可多对多,也可一对多,无拥塞控制,面向报文(以包的形式发送). 好比:域名系统 (DNS),视频流,IP语音(VoIP)。网络

 

 tcp的链接须要通过三次握手,断开须要通过四次挥手:socket

 UDp的链接和断开不须要三握和四挥.tcp

 

网络传输ios五层流程图:

pycharm里面默认用的是网络家族的TCP(字节流\数字流)协议

 

3、基于UDP协议下的socket网络通话.(type=cocket.SOCK_DGRAM)能够多人链接通话   datagram(数据包)

UDP协议下不会产生粘包现象,由于有消息边界,每次发送,都是以包的形式发送(有包头和消息组成),对方取值是,若是取值的"勺子"(recvfrom(n)的参数)设置的过小,就会出异常; 当太大时,一次只会取一个包.因此不会出现粘包现象.

 

UDP服务端:这里的recvfrom(1024)是UDP特有;TCP是recv(1024)设置从缓存取每次取值的大小,单位为字节)

UDP客户端:

 4、TCP通话(容许多人通话,但须要排队,跟一个客户端了以后才能跟下一个客户链接.),服务端:(addr是地址的缩写)

import socket  #创建网络通讯的模块
xiaoli = socket.socket() xiaoli.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) ip_xiaoli = ("127.0.0.1",8001) xiaoli.bind(ip_xiaoli) #侦听ip地址和端口,简称开机
xiaoli.listen(3) #默认为1,链接一个通道,能够配置,表示链接一个通道后,容许其余对象重用个人IP地址进行通话,但需排队等待
while 1: # 等待创建链接, conn是链接通道,addr是客户端的地址
    conn,addr=xiaoli.accept() print(addr) #查看客户端地址
    while 1: # 服务端经过conn链接通道来收发消息,经过recv方法,recv里面的参数是字节(B),1024的意思1024B=1KB
        kehu_xiaoxi = conn.recv(1024).decode("utf-8") print("客户端告诉你>>>",kehu_xiaoxi) if kehu_xiaoxi=="byebye": break
        # 回复消息:经过send方法,参数必须是字节类型的,
        tiwen = input("请输入内容:").encode("utf-8") conn.send(tiwen) conn.close()

 TCP多人通话,客户端:(#客户端的设置比服务端简单,省去了:侦听IP地址和设置消息通道,发送消息直接用实例对象.recv就行)

import socket xiaohei = socket.socket() #链接服务端的应用程序,经过connect方法,参数是服务端的ip地址和端口,打电话
xiaohei.connect(("127.0.0.1",8001)) while 1: tiwen1 = input("输入你想说的话:") xiaohei.send(tiwen1.encode("utf-8")) if tiwen1=="byebye": break duixiang = xiaohei.recv(1024).decode("utf-8") print("服务端说>>>",duixiang) xiaohei.close()

 5、小练习:TCP客户端每一个2秒发送一条时间戳给TCP服务端,TCP服务端吧它转换成格式化时间.

TCP服务端:

TCP客户端(time sleep(t) 函数推迟调用线程的运行,可经过参数secs指秒数,表示进程挂起的时间,t -- 推迟执行的秒数)

 

相关文章
相关标签/搜索