Python-网络编程(一)

  首先我们python基础部分已经学完了,而socket是我们基础进阶的课程,也就是说,你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引入,文件引入import等等,我可以在程序中获取到另一个文件的内容,对吧,但是那么突然有一天,你的朋友和你说:"把你电脑上的一个文件通过你自己写的程序发送到我的电脑上",这时候怎么办?你是不是会想,what?这怎么搞?就在此时,突然灵感来了,我可以通过qq、云盘、微信等发送给他啊,可是人家说了,让你用自己写的程序啊,嗯,这是个问题,此时又来一个灵感,我给他发送文件肯定是通过网络啊,这就产生了网络,对吧,那我怎么让我的程序能够通过网络来联系到我的朋友呢,并且把文件发送给他呢,那么查了一下,发现网络通信通过socket可以搞,但是怎么搞呢?首先,查询结果是对的,socket就是网络通信的工具,任何一门语言都有socket,他不是任何一个语言的专有名词,而是大家通过自己的程序与其他电脑进行网络通信的时候都用它。知道为什么要学习socket了吧~~朋友们~~而你使用自己的电脑和别人的电脑进行联系并发送消息或者文件等操作就叫做网络通信。

  对于一个小白来讲,看到这一节标题的你,此刻的你内心是拒绝的,不明白在说些什么。我理解你的心情,不要惊慌、不要着急,且听我娓娓道来。

  大家通过上面的内容大致的了解了一下什么是网络通信,那么在我们的日常生活中,哪里用到了网络通信呢,网络通信的整个流程又是什么样子的呢?我们要学的socket是怎么在网络中发挥作用的呢?让我们怀揣着这 三个问题 来进行下面的学习。

一.CS(服务端/客户端)架构

  我们使用qq、微信和别人聊天,通过浏览器来浏览页面、看京东的网站,通过优酷、快播(此处只是怀念一下)看片片啥的等等,通过无线打印机来打印一个word文档等,只要有无线、有网、有4G,我们就能好好的聊天,好好的看片片、好好的购物什么的,对吧,那么这些操作都叫做网络通信,确切来说都需要使用网络通信,前提是你要有网(大家记着这个'网',我下面会给大家详解),原来生活中处处使用了网络通信,我们通过网络通信的不同形式:比如说qq是我们下载到电脑或者手机上的应用程序(qq应用程序就是人家腾讯开发的软件,放到你的电脑或者手机上供你使用的,大概明白应用程序意思就行,不用深究~~),浏览器也是我们下载的应用程序,但是浏览器是通过页面来访问别人的网站的,而打印机我是通过我电脑上的word来操作使用的。根据这些不同的场景或者说不用的沟通方式,在业内划分了下面两个架构(架构:就是不同的组成结构)。在看下面的几个架构之前,我们需要知道什么是客户端,什么是服务端。客户端:安装在你电脑上的qq,浏览器(360浏览器、chrome浏览器、IE浏览器等),当我们使用qq发送消息的时候,消息先发送到了腾讯,然后腾讯在转发到你朋友的qq上,此时你的qq就是客户端,腾讯就是服务端。当我们使用浏览器来看京东的网站的时候,我们电脑上的浏览器就叫做客户端,京东就叫做服务端。

客户端英文名称:Client(使用服务端的服务),服务端英文名称:Server(一直运行着,等待服务别人,不能有一天访问百度,百度页面打不开,不行吧。),下面所说的C\S架构就是说的Client\Server架构。

    a.硬件C\S架构:打印机。

    b.软件C\S架构:QQ、微信、优酷、暴风影音、浏览器(IE、火狐,360浏览器等)。其中浏览器又比较特殊,很多网站是基于浏览器来进行访问的,浏览器和各个网站服务端进行的通讯方式又常被称为B\S架构(浏览器英文名称:Browser),web开发就是这个,后面大家知道有前端的课程对吧,前端就是浏览器上的知识,以后你会经常和浏览器打交道,学完前端就可以进行web开发全栈开发了。如果我把所有的东西都做成应用程序是不是很麻烦啊,要装很多的软件对吧,所有就开始有了B\S架构,只需要个浏览器就能使用很多的工具了,并且提供了一个统一入口,这也是为什么B\S架构火了起来。但是手机端的还是用的应用程序多一些,但是手机端B\S架构也是一个趋势,就像微信的小程序和公众号,为什么说是一个趋势呢,不仅仅是因为方便因为省钱,而是提供了一个统一的入口,其实微信早就实现了。统一入口是什么意思呢?就像我们公司经常用的一个公司内部管理系统,请假、打卡、报销、查客户等等,如果这些功能都需要打开一个网页或者app,是不是很难受啊,那么公司就做了这么一个系统,大家在这个系统上关于上班的一些你需要的功能就都能完成了,这就是统一入口。这也是一个开发思想,大程序分成几个小程序,开发速度也快,开发一个小功能就能上线,而不需要等着所有的功能全部开发完成才上线,解耦分治思想,公司做开发时这种思想很流行,迭代开发。说多了。。

    不管哪个架构,他们都要进行网络通信,基本都要用socket,我们学习socekt就是为了完成C\S架构项目的开发

二.网络通信流程

  明白了上面的C\S架构之后,我们就以自己本地的电脑上的浏览器去访问的京东网站的整个流程这种B\S架构来举例,有同学可能会问:你怎么不用qq或者微信来举例啊,是这样,因为qq和微信这种P2P的通信方式还是比较特殊的,也比较繁琐,具体为什么说它繁琐,我在博客的最后给大家说一下,然后有兴趣的同学可以去研究一番~~~

  网卡和mac地址

    你的电脑想要联网,首先要有一个网卡,而且电脑要做好相关的网路配置(如何配置,在下面有介绍)

Python-网络编程(一)_第1张图片

    电脑插网线的地方就做网卡,网卡提供了网络的接口,这是硬件上面的,大家都是到网口是吧,我怎么找到电脑的网卡呢,有人说用IP地址,IP地址并不是,而是全球唯一的mac地址,专门给网络设备设定的,是出厂的时候就给定好的,一个设备的mac地址号码是全球唯一的。 head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。   mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

      查看mac地址的方法:windows下在cmd窗口输入ipconfig -all指令:下面显示的这个物理地址就是mac地址。

 Python-网络编程(一)_第2张图片

    由于mac地址很难记忆,所以又出现了IP地址,在说IP地址之前,我们先说一下编码,我们都是到一个字节等于8位对吧,8个2进制的数,那么8位是不是可以表示256个字节啊,由于全球有太多的机器需要联网,那么网络设备的编号应该长一些,对不对,由4个点分十进制组成,由点分割的四个十进制的数,而十进制的数是不是在计算机中也是由二进制表示的啊,那么就成了这个样子:00000000.00000000.00000000.00000000 -- 11111111.11111111.11111111.11111111,0.0.0.0--255.255.255.255,也就是由4个8位的二进制数表示,这个表示就是我们的IP地址的形式。

      如果你用网线连网的,查看自己网络的属性,并且可以将ipv4版本的ip地址可以设置成静态的、也可以自动获取(动态分配的),下面是网络配置的大致方法:

      1、

      

      2、

      

 

       3、

      

       配置好自己电脑的网络信息之后,我们就有了身份证(mac地址)和名字(IP地址),通过他们,我们就在网络中有了自己的身份,只要有网,我们就可以正大光明的和别人进行通信了。

      arp协议功能:广播的方式发送数据包,获取目标主机的mac地址

      下面是网络通信流程图:

Python-网络编程(一)_第3张图片

  流程描述:

  第一步:打开浏览器,想要请求访问京东,在地址栏输入了网址:www.jd.com。(www.jd.com是域名就是一个IP地址的名称,IP地址不好记,所有有了域名。)

  第二步:先将请求信息发给了交换机,然后交给了路由器,路由发给DNS服务器,通过DNS协议去找我们要访问的京东的IP地址:

  第三步:查到的京东服务器对应的IP地址之后,路由器通过路由协议找到一个路由转发的最优路径,将你的请求信息还送给这个IP地址的京东的路由器

  第四步:京东的路由器发给了京东网站的服务器上

  第五步:京东网站服务器按照来的时候的路径,在返回给你他自己的网站

  第六步:当你打开浏览器的时候,你的电脑给你的浏览器这个运行起来的程序给了一个编号,叫做端口号,当你的电脑收到京东发送过来的消息的时候,你的电脑通过端口号找到你的浏览器,你的浏览器拿到了京东的网站信息,然后将网站呈现在了自己的浏览器上

  内网和外网:   

    所谓内网就是我们平常说的局域网。局域网就是在固定的一个地理区域内由2台以上的电脑用网线和其他网络设备搭建而成的一个封闭的计算机组。它可以是邻居之间的2台电脑,也可以是一幢100层大楼里的1000台电脑。局域网可以是独立封闭运行的,也可以是和外网相连接的。
所谓外网,也就是广域网。是一种地域跨度非常大的网络集合。它是由无数个局域网+独立服务器构成的。注意,此处所说的局域网既可以是小型的广域网,也可以是局域网。
    实际上,从规模上来看我们很难分辨局域网与广域网,因为大小都是相对的。所以。真正局域网与广域网的分别是通过IP地址来实现的。
    任何一台电脑要上网,都必须在网络上有一个唯一的IP地址。在局域网内,这个IP地址是唯一的。但是在另外一个局域网,这个IP地址仍然能够使用。
    网络A里有一台IP地址为192.168.1.231的客户端,网络B里也可以有一台同样IP的电脑。那么。我们就说这2台机器分别在2个局域网里。但是在广域网内,所有的IP地址都是唯一的。山西电信的DNS服务器IP地址是61.134.1.4.那么,这个地址在全世界都是唯一的,不可重复的。这就是广域网和局域网的区别。

    如果只有内网的ip地址你是不能上网的,你上网肯定要通过一个外网地址,这个外网地址又称为公网地址,这个公网地址是全球唯一的,他在你的对外出口的路由器上,也就是你的外网网关地址

三.初始socket

  还记得上面我说过的那个'网'吗,在这一节就给大家讲解,有些同学对网络是既熟悉又陌生,熟悉是因为我们都知道,我们安装一个路由器,拉一个网线,或者用无限路由器,连上网线或者连上wifi就能够上网购物、看片片、吃鸡了,但是这一系列的神操作到底是怎么让我们上网了呢?让我们起底揭秘!由于网络的内容非常的多,本篇博客主要是学socket网络编程,所以我把网络这方面的内容放到了我另外一篇博客上,这个博客很简单,不是什么深入研究类的博客,有网络基础的同学,可以直接往下面学习

  别忘了端口+IP能够确定一台电脑上的某一个应用程序~~

  那么我们通过下面的代码简单看一下socket到底是个什么样子,大概怎么使用:下面的程序就是一个应用程序,和qq啊、微信啊是一样的,都叫做应用程序。

import socket
#创建一个socket对象
server = socket.socket()  #相当于创建了一部电话
ip_port = ('192.168.111.1',8001) #创建一个电话卡
server.bind(ip_port) #插上电话卡
server.listen(5) #监听着电话,我能监听5个,接到一个电话之后,后面还能有四个人给我打电话,但是后面这四个人都要排队等着,等着我第一个电话挂掉,再来第6个的时候,第六个人的手机会报错
print('11111')
#等着别人给我打电话,打来电话的时候,我就拿到了和对方的这个连线通道conn和对方的电话号码addr
conn,addr = server.accept()  #阻塞住,一直等到有人连接我,连接之后得到一个元祖,里面是连线通道conn和对方的地址(ip+端口)
print('22222')
print(conn)
print('>>>>>>>>>',addr)
while True:
    from_client_data = conn.recv(1024) #服务端必须通过两者之间的连接通道来收消息
    from_client_data = from_client_data.decode('utf-8')
    print(from_client_data)
    if from_client_data == 'bye':
        break
    server_input = input('明威说>>>>:')
    conn.send(server_input.encode('utf-8'))
    if server_input == 'bye':
        break
conn.close() #挂电话
server.close() #关手机

  listen(3),这个3的意思是我连接着一个,后面还可以有三个排队的,也就是支持4个人的服务,但是后面三个要排队。

#_*_coding:utf-8_*_
import socket
import time

client = socket.socket()
server_ip_port = ('192.168.111.1',8001)

client.connect(server_ip_port)

while True:
    client_input = input('小文说>>>>:')
    client.send(client_input.encode('utf-8')) #给服务端发送消息
    if client_input == 'bye':
        break
    from_server_data = client.recv(1024)

    print('来自服务端的消息:',from_server_data.decode('utf-8'))
    if from_server_data.decode('utf-8') == 'bye':
        break
client.close() #客户端挂电话

  注意:先运行server,然后再运行client,然后你会发现client这个文件再输出台的地方让你输入内容,你输入一个内容然后回车,你会发现server那边的控制台就输出了以client发送的内容

四 总结及其他一些内容简介

  最后,至于路由是如何进行转发的、内部路由表是如何保存的、网关是如何计算最后传输路线的、路由的内网是如何划分的、DHCP和静态IP是如何设置的,DHCP又是如何分配IP地址的,交换机内部工作原理、路由和交换机如何进行配置等等,我们在本篇博客上就不进行深入研究了,本篇博客是为了让小白同学熟悉一下网路相关知识。谢谢大家谅解,如何大家想了解其他的内容,请给我留言,我就会把相关内容整理出来,分享给大家。你的问题是我们共同进步的动力。

  为什么说qq这种p2p的网络通信方式比较特殊呢,因为它是两个局域网的电脑或者手机进行通讯,双方不能确定对方的IP地址,因为你的qq也不知道在哪里登陆,用什么网络,对吧,也就是说双方不知道对方的IP地址,怎么办,需要借助第三方承接,就是腾讯,那么这里面就涉及到了udp打洞,net穿透等技术,有兴趣的可以去了解一下,腾讯为什么nb,也是因为它基本上是国内第一家实现了这些技术的公司,让我们的qq沟通更加方便。

 

 

转载于:https://www.cnblogs.com/pythoncainiao/p/10209757.html

你可能感兴趣的:(Python-网络编程(一))