Python的Socket知识1:入门(TCP/IP、Socket、HTTP)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PbGc396Dwxjb77F2je/article/details/80154999

理论知识:

1、TCP/IP协议

    计算机产生后,最先是单机互不兼容模式,随着发展,计算机被一个个的连接起来,形成了一个计算机网路,实现了计算机通信及信息共享,远距离传递信息等工作。互联的过程就需要一个个协议。

    协议就是计算机之间通过网络实现通信时事先达成的一种“约定”;这种“约定”使那些由不同厂商的设备,不同CPU及不同操作系统组成的计算机之间,只要遵循相同的协议就可以实现通信。协议可以分很多种,每一种协议都明确界定了它的行为规范:两台计算机之间必须能够支持相同的协议,并且遵循相同的协议进行处理,才能实现相互通信。

    互联网中常用的代表性的协议有IP、TCP、HTTP等,LAN中常用协议有IPX、SPX等

“计算机网络体系结构”将这些网络协议进行了系统的归纳;TCP/IP就是这些协议的集合。    640?wx_fmt=png&wxfrom=5&wx_lazy=1

    TCP/IP协议(transmission control protocol and internet protocol),传输控制协议/因特网互联协议,又叫网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。

    TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。


2、开放系统互连模型(Open System Interconnection,OSI)。也叫七层参考模型

     OSI参考模型它是为了使各层上的协议国际标准化而发展起来的。OSI共有7层,从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 ;

其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流。


640?wx_fmt=png

640?wx_fmt=png

    在七层模型中,每个分层都接受由它下一层所提供的特定服务,并且负责为自己的上一层提供特定的服务,上下层之间进行交互所遵循的约定叫做“接口”,同一层之间的交互所遵循的约定叫做“协议”。

7层模型介绍:

具体可参考:https://www.cnblogs.com/imyalost/p/6086808.html

640?wx_fmt=png640?wx_fmt=png


3、socket,是在应用层和传输层之间的一个抽象层,提供了进程通信的管道,至于传什么东西,都是自己定义的。

    Socket又称"套接字"(用于描述IP地址和端口)是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。其实就是一种通信机制。

    类似于银行、电信的电话客户部门。你打电话时,客户部门会分配一个专员回答你的问题,客户部门就相当于socket的服务器端了,你就相当于客户端,在和你通话结束前,你无法同其他人通话(同时通话),同样,客户部门的电话交换机也不会重复分配。

640?wx_fmt=png

socket的位置:

640?wx_fmt=png

    socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

大概流程是:
      客户端:需要先建立套接字,然后申请连接服务器,需要知道服务端的ip和端口号,而不需要指定客户端的(客户端会由os分配),连接上服务器后开始读写信息,最后关闭套接字。
      服务端:建立监听套接字,绑定地址和端口号,然后开始监听,等待客户机连接,生成一个响应套接字,负责处理这个连接请求,然后读写信息,关闭响应套接字,关闭监听套接字。

    涉及的参数及流程如下:

640?wx_fmt=png

用打电话形象比喻整个流程和参数:

服务器端(收、发消息):

#1买手机

创建socket

s=socket.socket()

#2买手机卡,绑定在手机上

将套接字绑定到地址address(ip地址和端口号)

s.bind('127.0.0.1',9999)

#3开机监听

打开连接,监听传输链接,n为在拒绝连接之前,操作系统可以挂起的最大连接数量,该值至少未1,大部分应用程序设置为5就可以了。

s.listen(5),n为能挂起的链接数

#4等待电话,一次只能接听一个电话。

接收连接请求,并返回conn,address。conn是新建的套接字段,用来接受和发送数据,相当于连接的那根电话线。address是链接客户端的地址。

conn,addr=s.accept()

#5接电话,收消息

接收客户端打来电话(消息),1024代表一次性发送多少字节内容

recv_data=conn.recv(1024)

#6回应消息

send_data=recv_data.upper()
conn.send(send_data)

#7挂电话

关闭套接字

conn.close()

客户端(发、收消息):

#1买手机

创建socket

s=socket.socket()

#2拨号连接

为socket绑定ip地址和端口号

s.connect('127.0.0.1',9999)

#3发消息

发送消息给服务器端

send_data=input(">>").strip()

s.send(bytes(send_data,encoding="utf-8"))

#4收消息

接收服务器端消息

recv_data=s.recv(1024)
print(str(recv_data,encoding="utf-8"))

#6挂电话

conn.close()

案例1:建立简单socket案例,客服器与客户端一对一,实现字符转为大写。

    分别建立服务器和客户端程序,每次执行时,需要先运行服务器程序,再运行客户端程序。交互一次消息即结束,多次交互需要多次运行服务器。

640?wx_fmt=png

1、建立scoket_server服务器的程序。

#socket_server
#服务器有收、发的功能,程序运行时需要先运行服务器,再运行客户端
#0、导入模块
import socket
ip_port=('127.0.0.1',9999)#定义服务器的ip,9999为端口,端口可以从1024之后的数字写

#1、创建socket(买手机)
s=socket.socket()#无参数,默认封装TCP协议

#2、为socket绑定ip地址和和端口号(买手机卡,装在手机上)
s.bind(ip_port)#参数必须为一个元祖的形式

#3、监听端口号请求,随时准备接收客户端发来的连接(开机等待接电话)
s.listen(5)#参数代表最大挂起5个链接,最大接听5个客户端,python3.5默认128个

#4、被动等待并接收客户端连接的请求(等待电话,一次只能听一个电话)
#accept是一个阻塞的过程,同一时间只能接收一个电话/客户端,如果有其他的电话进来,就得等待,直到上一个客户端返回完成连接信息
conn,addr=s.accept()#conn类似于一个客户端与服务端连接的那根线,每个客户端都是唯一的,addr是一份地址列表

#5、接收消息(收消息)
recv_data=conn.recv(1024)
#6、修改消息并重新发送消息至客户端(发消息)
send_data=recv_data.upper()#处理消息,案例的upper为转成大写功能
conn.send(send_data)
#7、挂断
conn.close()

2、建立socket_client客户端的程序

#socket_client
#客户端是发和收消息
import socket
ip_port=('127.0.0.1',9999)

#1、客户端创建socket(买手机)
s=socket.socket()

#2、根据服务器ip和端口号试图发送连接请求给服务器(拨号)
s.connect(ip_port)
#3、写入发送的消息(发送消息)
send_data=input(">>").strip()
s.send(bytes(send_data,encoding="utf-8"))#不同于服务器的地方,这里用s,而不用conn
#4、接收服务器返回的消息(接受消息)
recv_data=s.recv(1024)
print(str(recv_data,encoding="utf-8"))#直接把bitys转变为utf8
#5、挂断
s.close()

执行结果:

640?wx_fmt=png


案例2:实现循环多次收发消息。启动服务器一次即可,客户端退出,不影响服务器。

1、scoket_server服务器程序。两层循环:1)一个客户端断开,不影响服务器继续接收下一个客户端。2)服务器断开或发送空消息,就剖出异常,并继续等待收消息

#socket_server#服务器
import socket
ip_port=('127.0.0.1',8999)
s=socket.socket()
s.bind(ip_port)
s.listen(5)

while True:#一个客户端退出,服务器不退出,继续监听其他客户端。
   
conn,addr=s.accept()#conn是唯一的
   
while True:
try:
recv_data=conn.recv(1024)
if len(recv_data)==0:break#如果客户端消息为空,则断开本次循环,执行close()
           
send_data=recv_data.upper()
conn.send(send_data)
except Exception:#客户端断开的异常处理
           
break
   
conn.close()#语句结束后,继续执行conn,addr=s.accept()

2、socket_client客户端程序;

#socket_client客户端
import socket
ip_port=('127.0.0.1',8999)
s=socket.socket()
s.connect(ip_port)

while True:#用于控制循环调用服务器
   
send_data=input("请输入消息>>").strip()
if send_data=="exit":break #控制退出标志
   
if len(send_data)==0:continue#控制空消息继续等待输入
   
s.send(bytes(send_data,encoding="utf-8"))
recv_data=s.recv(1024)
print(str(recv_data,encoding="utf-8"))#直接把bitys转变为utf8
#5、挂断
s.close()

执行结果:

640?wx_fmt=png


附:其他知识

1、HTTP协议

    HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议,所有的WWW文件都必须遵守这个标准。在Internet上的Web服务器上存放的都是超文本信息。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

    HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

    在TCP/IP协议栈中的位置:

    HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:

640?wx_fmt=png

默认HTTP的端口号为80,HTTPS的端口号为443。


HTTP的请求响应模型:

HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系.

    HTTP协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。

    见下图:

640?wx_fmt=png

HTTP工作流程:一次HTTP操作称为一个事务,其工作过程可分为四步:

  • 首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

  • 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

  • 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

  • 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

    如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。


    通过HTTP或者HTTPS协议请求的资源由统一资源标示符(Uniform Resource Identifiers)(或者,更准确一些,URLs)来标识。


2、URL

    我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator,统一资源定位符,用于定位网上的资源)。就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当你在http浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。

URL地址格式排列为:scheme://host:port/path,

例如    http://www.sohu.com/domain/HXWZ就是一个典型的URL地址。

    它从左到右由下述部分组成:

  • Internet资源类型(scheme):指出WWW客户程序用来操作的工具。如“http://”表示WWW服务器,“ftp://”表示FTP服务器,“gopher://”表示Gopher服务器,而“new:”表示Newgroup新闻组。

  • 服务器地址(host):指出WWW页所在的服务器域名,比如mail.表示邮箱,还可以自定义。

  • 端口(port):有时(并非总是这样),对某些资源的访问来说,需给出相应的服务器提供端口号。

  • 路径(path):指明服务器上某资源的位置(其格式与DOS系统中的格式一样,通常有目录/子目录/文件名这样结构组成)。与端口一样,路径并非总是需要的。


    比如:http://mail.163.com/index.html,解析如下:

  • http://:这个是协议,也就是HTTP超文本传输协议,也就是网页在网上传输的协议。

  • mail:这个是服务器名,代表着是一个邮箱服务器,所以是mail,也可以是www、或自定义

  • 163.com:”这个是域名,是用来定位网站的独一无二的名字

  • mail.163.com:这个是网站名,由服务器名+域名组成。

  • /:这个是根目录,也就是说,通过网站名找到服务器,然后在服务器存放网页的根目录

  • index.html:这个是根目录下的默认网页

  • http://mail.163.com/index.html:这个叫做URL,统一资源定位符,全球性地址,用于定位网上的资源。   

具体参考:

http://www.blogjava.net/zjusuyong/articles/304788.html

案例1代码链接:https://pan.baidu.com/s/1kW7GpJT 密码:zhq8

案例2代码链接:https://pan.baidu.com/s/1dHligKT 密码:d6x4

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页