day25 网络编程之socket

1.  为什么要学习socket?

    socket就是网络通信的工具,任何一门语言都有socket,他不是任何一个语言的专有名词,而是大家通过自己的程序与其他电脑进行网络通信的时候都用它。

2.  客户端,服务架构

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

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

    b.软件C\S架构:

      B\S架构:浏览器(browser)\服务端>>>统一接口

3.  网路通讯的整个流程

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

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

扫描二维码关注公众号,回复: 4173562 查看本文章

例. 浏览器访问京东网站

流程描述:

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

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

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

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

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

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

内网和外网:  

    真正局域网与广域网的分别是通过IP地址来实现的。
    任何一台电脑要上网,都必须在网络上有一个唯一的IP地址。在局域网内,这个IP地址是唯一的。但是在另外一个局域网,这个IP地址仍然能够使用。
    网络A里有一台IP地址为192.168.1.231的客户端,网络B里也可以有一台同样IP的电脑。那么。我们就说这2台机器分别在2个局域网里。但是在广域网内,所有的IP地址都是唯一的。山西电信的DNS服务器IP地址是61.134.1.4.那么,这个地址在全世界都是唯一的,不可重复的。这就是广域网和局域网的区别。

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

DNS服务器

    当我们请求https:\\www.JD.com的时候,首先电脑会在本地的DNS缓存中找是否有这个DNS缓存(DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的表,以解析消息的域名。 域名是Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。域名是由一串用点分隔的名字组成的,通常包含组织名,而且始终包括两到三个字母的后缀,以指明组织的类型或该域所在的国家或地区。 DNS是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写,它是由域名解析器和域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,一个IP地址可以有多个域名,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。域名服务器通常为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为“域名解析”。)本地的DNS缓存是在我们访问过一个网站之后,例如京东,那么本地会保存一个京东域名和京东服务器IP地址的映射关系,将来再次请求的时候,就不用再到外部的DNS上查询这个域名对应的IP地址了,提高了效率,如果是第一次请求,请看上面的DNS查询过程

网关:   

    我们经常说的网关是指的传输网关,简称网关,我们主要就看它,网关在路由器这里,当请求信息发送到了网关这里的时候,我们先到路由表里面看看有没有这个请求的目标地址的IP,如果没有说明不是我们自己网络内部的IP地址,需要路由转发出去,到internet网络中,但是网络这么大,怎么办,那么通过网关计算出一个最佳的传输路径去找到对应的目标网关地址,在路由转发的过程中(当请求被路由B接收到了之后,路由B打开之后发现不是找自己的,就会把请求信息包继续转发)然后传输到这个网关地址的路由器上,目标网关路由器上设置了一些IP地址+端口和各个服务器上的映射关系,即便是所有的交换机都接收到了这个请求,但是还是能够找到对应的服务器。在通过交换机发送到对应的服务器上

    那么网关到底是什么呢?网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为 “192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上, TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网络B向网络A转发数据包的过程也是如此。

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

    

3.    socket

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() #关手机

test_server.py
#_*_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() #客户端挂电话

test_client.py

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

猜你喜欢

转载自www.cnblogs.com/tjp40922/p/9995858.html