zoukankan      html  css  js  c++  java
  • day36-socket(C/S架构)套接字

    一.客户端/服务器架构
    1.C/S架构:
    (1)硬件C/S架构(打印机)
    (2)软件C/S架构(web服务)
    2.生活中的C/S架构:
    饭店是S端,所有食客是C端
    3.C/S架构与socket的关系:
    socke就是为了完成C/S架构的开发
    二.互联网协议osi七层
    1.一个完整的计算机系统由硬件,操作系统,应用软件三者组成,具备了这三个条件,一台计算机系统就可以自己跟自己玩了,如果要跟别人一起玩,就需要上网,互联网的核心就是由一堆协议组成,协议就是标准,全世界人通信的标准是英语,如果把计算机比作人,互联网协议就是计算机界的英语。所有的计算机都学会了互联网协议,那所有的计算机都可以按照统一的标准去收发信息从而完成通信了。人们按照分工不同把互联网协议从逻辑上划分了层级。
    第一层物理层:目的是传输的连接介质(光缆,双绞线,无线电波),物理层就可以发送电信号010101
    第二层数据链路层:负责把发送的电信号010101分组后电信号就有意义了,以太网协议,包含报头(原mac和目标mac)和数据部分,有了原mac和目标mac就可以基于广播的方式发送(mac标识在这个局域网的哪一个位置)
    第三层网络层:IP协议标识一个网络的(IP在标识不同的子网在哪里),发送方式首先通过IP地址跟子网掩码地址计算得到一个自己的网络地址和目标网络地址,如果在一个子网里面可直接通信,如果不在一个子网里这个包就会送给网关,网关在转发到一样的子网里
    第四层传输层:基于TCP和UDP协议端口方式
    TCP协议三次握手和四次挥手
    (1)三次握手:是你得让对方知道你已经知道他知道,确定我和对方都准备好了再传输数据
    发起一次握手:客户端与服务器发生连接首先要发syn包请求到达服务器端(syn包:原IP,目标IP,原端口,目标端口)
    收到一次握手:当服务器端服务器收到syn之后,他的状态就会转变成SYN_RECV(指的是某一个连接) 服务器会创建一个socket_buff
    发起二次握手:服务器会回一个包syn+ack
    收到二次握手:客户端收到包之后,客户端已经相应了,客户端回第三个包ack发起三次握手
    收到三次握手:当服务器收到第三个包之建立好3次握手状态就会变成establi
    (2)传输上层数据:
    当两端只有建立establi之后,客户端才能传输上层数据
    session建立TCP/IP会话
    发起一个请求要index.html文件----有数据服务器返回数据                         
    (3)四次断开:四次断开时客户端和服务器都可以发起断开,因为会牵扯到数据传输所以要四次断开(谁先发完包谁就主动发起断开连接)
    发起一次断开:客户端发起了一个fin请求给服务端,客户端会进入fin_wait_1状态(主动断开连接请求)
    发起二,三次断开:服务器收到fin他会把自己的状态设置成CLOSE_WAIT,他给客户端回一个ack,代表收到fin这个事(被动断开一端会出现CLOSE_WAIT)
    发起四次断开:客户端收到后会把状态设置成FIN_WAIT2,等待服务器最后发送的FIN,等收到最后的FIN,状态会变成TIME_WAIT(主动断开的一端会出现TIME_WAIT),当客户收到fin回一个ack(TIME_WAIT默认停留一分钟 等ack数据包)到此整个通讯结束
    第五层会话层:解除或建立与其他接点的联系
    第六层表示层:数据格式化,代码转换,数据加密
    第七层应用层:本机开启一个软件会监听这个端口(跑TCP或UDP协议),端口会跟IP地址还有mac信息相绑定标识了哪一个子网当中一个程序
    三.socket
    1.socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在socket接口的后面,对于用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议,所以我们无需深入理解TCP/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的
    2.socket的五个协议:组成一个逻辑上的文件
    (1)原端口-sport
    (2)原IP-sip
    (3)目标端口-dport:对端主机交给哪个进程的
    (4)目标IP-dip
    (5)协议-tcp/ip
    只要其中任意一个发生改变就不是同一个socket
    四.套接字发展及分类
    1.一开始,套接字被设计用在同一台主机上多个应用程序之间通讯,这也被称进程间通讯或IPC。套接字有俩种(或者称为有俩个种族),分别是基于文件型的和基于网络型的
    2.基于文件类型的套接字家族:AF_UNIX
    unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,俩个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信
    3.基于网络类型的套接字家族:AF_INET
    AF_INET是一种广泛的一个,python支持多种地址家族,但是由于无名指关心网络编程,所以大部分时候我们只使用AF_INET
    五.TCP/IP 套接字
    1.结合现实生活的工作流程

      TCP服务端                                TCP客户端
    socket()--买手机                         socket()
    bind()  --绑定一个手机卡          
    lister()--开机                    
    accept()--等电话,拿到一个电话链接          connect()拨电话把请求给服务端accept()
    read()  --收消息                         write()发消息给服务端read进行一系列处理
    write() --发消息                         服务端回应数据给客户端read(),再执行write             
    close() --断开电话链接            
    close() --关机                           客户端关闭链接close()
    套接字对象的内置方法
    名称    描述
    服务器方法
    bind    将地址(主机名、端口号)绑定到套接字上
    listen    设置并启动 TCP 监听器
    accept    被动接受 TCP 客户端连接,一直等待,直到连接到达(阻塞)
    客户端方法
    connect    主动发起 TCP 服务器连接,遇到问题会报错
    connect_ex    connect 的扩展版本,会以错误码的形式返回问题,不会报错
    普通方法
    recv    接收 TCP 消息
    recv_into    接收 TCP 消息到指定的缓冲区
    send    发送 TCP 消息
    sendall    完整地发送 TCP 消息
    recvfrom    接收 UDP 消息
    recvfrom_into    接收 UDP 消息到指定的缓冲区
    sendto    发送 UDP 消息
    getpeername    连接到套接字 TCP 的远程地址
    getsockname    当前套接字的地址
    getsockopt    返回给定套接字选项的值
    setsockopt    设置给定套接字选项的值
    shutdown    关闭连接
    close    关闭套接字
    detach    在未关闭文件描述符的情况下关闭套接字,返回文件描述符
    面向阻塞
    setblocking    设置套接字的阻塞或非阻塞模式
    settimeout    设置阻塞套接字操作的超时时间
    gettimeout    获取阻塞套接字操作的超时时间
    面向文件
    fileno    套接字的文件描述符
    makefile    创建与套接字关联的文件对象
    数据属性
    family    套接字家族
    type    套接字类型
    proto    套接字协议
    
    作者:Manchangdx
    链接:https://www.jianshu.com/p/f4e17341f343
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    tcp协议的:

    服务端:
    # 服务端应该满足的特点:
    # 1、一直提供服务
    # 2、并发地提供服务
    import socket
    
    # 1、买手机
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
    
    # 2、绑定手机卡
    phone.bind(('127.0.0.1',8080)) # 0-65535, 1024以前的都被系统保留使用
    
    # 3、开机
    phone.listen(5) # 5指的是半连接池的大小
    print('服务端启动完成,监听地址为:%s:%s' %('127.0.0.1',8080))
    
    # 4、等待电话连接请求:拿到电话连接conn
    # 加上链接循环
    while True:
        conn,client_addr=phone.accept()
    
        # 5、通信:收发消息
        while True:
            try:
                data=conn.recv(1024) # 最大接收的数据量为1024Bytes,收到的是bytes类型
                if len(data) == 0:
                    # 在unix系统洗,一旦data收到的是空
                    # 意味着是一种异常的行为:客户度非法断开了链接
                    break
                print("客户端发来的消息:",data.decode('utf-8'))
                conn.send(data.upper())
            except Exception:
                # 针对windows系统
                break
    
        # 6、关闭电话连接conn(必选的回收资源的操作)
        conn.close()
    
    # 7、关机(可选操作)
    phone.close()
    服务端:
    import socket
    
    #1、买手机
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
    
    #2、拨通服务端电话
    phone.connect(('127.0.0.1',8080))
    
    #3、通信
    while True:
        msg=input("输入要发送的消息>>>: ").strip() #msg=''
        if len(msg) == 0:continue
        phone.send(msg.encode('utf-8'))
        print('======?')
        data=phone.recv(1024)
        print(data.decode('utf-8'))
    
    #4、关闭连接(必选的回收资源的操作)
    phone.close()

    udp协议的:

    服务端:
    import socket
    
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议=》udp协议
    
    server.bind(('127.0.0.1',8081))
    
    while True:
        data,client_addr=server.recvfrom(1024)
        server.sendto(data.upper(),client_addr)
    
    
    server.close()
    服务端:
    import socket
    
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 流式协议=》tcp协议
    
    while True:
        msg=input('>>>: ').strip()
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8081))
        res=client.recvfrom(1024)
        print(res)
    
    client.close()
  • 相关阅读:
    漫谈架构读书笔记
    软件架构怎样进行架构
    大型网站技术架构阅读笔记6
    beta里程碑总结
    团队总结
    用户体验
    小强大扫荡
    团队测试计划
    团队第二次冲刺第十天
    团队第二次冲刺第九天
  • 原文地址:https://www.cnblogs.com/xiao-zang/p/12739491.html
Copyright © 2011-2022 走看看