python-网络编程
网络编程的理论概述:
现在的生活离不开网络,例如手机,电脑,平板,都是网络的代名词,通过一些APP,浏览器,获取大量的信息如
文字、声音、视频,这都是从网络的某个地址存在的或者是网络的另一端某个用户通过设备共享的,那么什么是网
络?是通过又是如何共享的尼?网络是由若干节点和连接这些节点的链路构成,表示诸多对象及其相互联系,像我
们平常办理宽带与手机办卡上网,都是通过向某一服务商缴费注册连上他们的设备,下载相应的聊天软件和浏览器
就可以上网与他人交流、获取资源、浏览一些网络信息。
当然还有一些其他的网络内容包含的范围非常大,只是没有接触到。现在的信息非常的发达,我们接触到的信息也
非常的多,那么我们的信息是怎么完成网络共享,资源共享的尼?
我们第一时间就是想到,浏览器,微信,QQ,这都是非常常见的网络信息传递和获取的方式,那是怎么传递的
尼?网络又是一个什么样的?这里将引入网络模型的概念,常见的七层OSI模型与四层TCP/IP模型诠释了网络的连
接与资源传递,当一个用户或一台主机向另一个用户或一台主机获取或是发送资源,中间的连接方式就封装在模型
概念上传输或连接。
Socket是什么:
我们了解了协议的基本概念,协议之间的关系,与层级之间的关联,完成了对网络的一个理解,当我们在QQ、微
信给别人发送消息时,就是通过这些层级数据传输的协议去传输我们的内容,或是我们浏览网页,打开一个百度页
面,都是基于协议传输的数据显示请求的页面,那我们如何去实现这些?不可能每一步都需要去写,从最底层开始
写起,那就太麻烦了,由此引出一个概念Socket,需要一一解答的问题,Socket在哪里?Socket是什么?目的是为
了做什么?先看下
Socket也叫套接字(Socket)随着TCP/IP协议的使用,也越来越多地被使用在网络应用程序的构建中。实际上,
Socket编程也已经成为网络中传送和接收数据的首选方法。套接字最早是由伯克利在BSD中推出的一种进程间通信
方案和网络互联的基本机制。现在,已经有多种相关的套接字实现,但是大部分还是遵循着最初的设计要求。套接
字相当于应用程序访问下层网络服务的接口。使用套接字,可以使得不同的主机之间进行通信,从而实现数据交
换。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面
模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织
数据,以符合指定的协议。
Socket 详细:
本地的进程间通信(IPC)有很多种方式,例如
队列
同步(互斥锁、条件变量等)
以上通信方式都是在一台机器上不同进程之间的通信方式,那么问题来了
网络中进程之间如何通信?
网络中进程之间如何通信
首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!
在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。
其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议
+端口”可以唯一标识主机中的应用程序(进程)。
这样利用 ip地址,协议,端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交
互
socket(简称 套接字 ) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的
进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊
天、收发 email 等等
Socket编程:
那我们如何实现尼?
在 Python 中 使用socket 模块的函数 socket 就可以完成:
说明:
套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序
进行通信。这就是所谓的进程间通信(Inter Process Communication,IPC)
有两种类型的套接字:基于文件的和面向网络的。
''
函数 socket.socket 创建一个 socket,返回该 socket 的描述符,该函数带有两个参数:
- Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程
间通信),实际工作中常用AF_INET
- Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接
字,主要用于 UDP 协议)
那我们来创建一个基于tcp socket的套接字:
import socket
# 获得socket对象 AF_INET表示基于网络的套接字
# SOCK_STREAM表示的是TCP协议
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print ('Socket Created')
SocketServer
UPD
UDP — 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程
序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器
之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任
何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
UDP特点:
UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广
播发送。 UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发
送方所发送的数据报并不一定以相同的次序到达接收方。
【适用情况】
UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数
据业务,比如
语音广播
视频
QQ
TFTP(简单文件传送)
SNMP(简单网络管理协议)
RIP(路由信息协议,如报告股票市场,航空信息)
DNS(域名解释)
相比较于TCP注重速度流畅
UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如
视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理
一些。
那如何实现尼?
我们创建一个udp客户端程序的流程是简单的,具体步骤如下:
'''
1. 创建客户端套接字
2. 发送/接收数据
3. 关闭套接字
'''
下面一个示例代码
客户端:
客户端的结构:
(1)使用socket(),生成套接字描述符;
(2)通过host_post 结构设置服务器地址和监听端口;
(3)向服务器发送数据,sendto() ;
(4)关闭套接字,close() ;
通过客户端发送成功,我们指定了端口,但是我们没有与服务器建立连接,没有确定8080端口的连接对象,可以
将ip地址与端口随意需改符合要求的范围,都可以将数据正常发送
此时数据发送,这里就体现UDP数据的特性,面向无连接的通讯协议
这里我们接受数据该如何实现尼?往下看
服务器端如下代码:
接收数据
服务器端的结构
先运行我们的服务器,再运行我们的客户端,输入我们需要给到服务器的数据,
在客户端,观察发现向服务器发送消息的时候没有给客户端绑定端口?原来操作系统在此 做了些隐蔽的事情,当
socket首先向服务器发消息时客户端自动选折IP和一个PORT与该socket关联了起来。
那客户端与服务器之间的交互,能不能绑定端口,更多是多人交互尼,来我们继续往下走
echo服务的应用 ,echo服务是一种非常有用的用于调试和检测的工具。该协议接收到什么原样发回,类似于日常
生活中的“回声”,即存在回显
客户端修改后面代码:
服务端修改代码: