网络通信 & 初识socket

发布时间:2019-04-09 21:38:35编辑:auto阅读(1777)

    本节主要内容:

    1.客户短\服务端架构

    2.网络通信的流程

    3.初识socket

     

    一.客户端\服务端架构

    客户端\服务端架构:

    Client/Server (C/S) 结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,需要安装客户端才可进行管理操作。
    客户端和服务器端的程序不同,用户的程序主要在客户端,服务器端主要提供数据管理、数据共享、数据及系统维护和并发控制等,客户端程序主要完成用户的具体的业务。
     
    B\S架构:
    Browser/Server (浏览器/服务器) 结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现。
    客户端基本上没有专门的应用程序,应用程序基本上都在服务器端。由于客户端没有程序,应用程序的升级和维护都可以在服务器端完成,升级维护方便。由于客户端使用
    浏览器,使得用户界面“丰富多彩”,但数据的打印输出等功能受到了限制。为了克服这个缺点,一般把利用浏览器方式实现困难的功能,单独开发成可以发布的控件,在客户
    端利用程序调用来完成.
     

    软件C\S架构:客户端\服务端架构:京东,淘宝,今日头条,qq,微信.....

    B\S架构:浏览器(browser)\服务端>>>统一接口,例: 微信上的小程序

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

     

     二.网络通信的流程

    网络通信中的一些基本概念: 

    网线:传送电信号

    网卡: 提供网络接口,接收电信号

    MAC地址: 长度为48位二进制, 通常由12位16进制数表示(前六位是厂商编号, 后六位是流水线号), 每块网卡出厂时都被烧制了全球唯一的mac地址.

    Ethernet规定接入Internet的设备都必须具备网卡, 发送端和接收端的地址便是网卡的地址.

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

    集线器:将所有连接到集线器的网络设备连通起来

    交换机: 升级版的集线器

    路由器:用来转发消息

    路由协议:用来计算转发消息的最优路径

    IP地址: 互联网协议地址, 它是IP协议提供的一种统一的地址格式, 它为互联网上的每一个网格和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异.在IPv4里有32位二进制数组成, 通常被分割为4个8位二进制数, 由四个点分十进制数表示.

    DHCP服务: 是一个局域网的网络协议, 使用UDP协议工作, 用于内部网络自动分配IP地址

    子网掩码: 格式与IP地址一样, 将某个IP地址划分成网络地址和主机地址两部分, 用来判断两个IP地址是否在一个网段.1表示网络地址, 0表示主机地址.

    网关: 一个网络通向其他网络的IP地址, 即路由器的IP地址

    DNS: 进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器

    广播: 将源MAC地址,目标MAC地址及信息通过交换机和路由器发送给局域网内的所有其他设备

    ARP协议: 地址解析协议,主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址.

     

    网络通信的流程:

    关于网络通信的整个流程请点击链接查看.

     

    三.初识socket

    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() #关手机
    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发送的内容
    通过上面两段代码,我们队网络编程有了一个大概的认识

关键字

上一篇: python-01

下一篇: Python基础知识之2——字典