• 网络编程


    架构

    客户端

    CS架构:client  ->  server        

    浏览器

    BS架构:browser  ->  server

    相互通信

    相互通信的本质发送的是字节(01)

    交换机的作用:为接入的网络节点提供电信号通路

    路由器:连通不同的网络,另一个作用是选择信息传送的线路

    通过在cmd中输入ipconfig查看自己的内网ip,公网ip需要租服务器

    socket模块实现网络通信

    socket模块

     黏包

    通常一次的数据发送与接收的最大限度是1024字节,但是当超过这个限度时,此次的数据传送只包含1024字节,剩下的内容并没有丢失,当下次数据发送来时,就会发送上次超过限度的数据,依次向后延送,这就是黏包.

    同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包。

    import struct
    import subprocess
    import socket
    
    print("server link start ...")
    server = socket.socket()
    server.bind(("192.168.13.110", 9527))
    server.listen(5)
    while True:
        con, di = server.accept()
        try:
            while True:
                ret = con.recv(1024).decode()
                # 操作命令
                ret_command = subprocess.Popen(ret,
                                               shell=True,
                                               stderr=subprocess.PIPE,
                                               stdout=subprocess.PIPE
                                               )
                ret_command_out = ret_command.stdout.read()
                # 操作指令执行后的内容长度
                length_out = struct.pack("i", len(ret_command_out))
                ret_command_err = ret_command.stderr.read()
                # 操作指令错误提示内容的长度
                length_err = struct.pack("i", len(ret_command_err))
                if ret_command_err:
                    # 发送操作指令错误提示内容的长度
                    con.send(length_err)
                    con.send(ret_command_err)
                else:
                    # 发送操作指令执行后的内容长度
                    con.send(length_out)
                    con.send(ret_command_out)
        except ConnectionResetError as e:
            con.close()
            continue
    server
    import struct
    import socket
    print("client link start ...")
    client = socket.socket()
    client.connect(("192.168.13.110", 9527))
    # 建立连接
    while True:
        # 不能发送空
        content = input("请输入指令>>>>")
        if not content:
            continue
        client.send(content.encode())
        ret_received = ""
        ret_received_length = 0
        # 接收发送的内容长度
        length = struct.unpack("i", client.recv(4))[0]
        ret_content = client.recv(1024).decode("gbk")
        # 将这个长度的内容接收完整
        while ret_received_length < length:
            ret_received_length += len(ret_content)
            ret_received += ret_content
    
        print(ret_received)
    client

     三次握手

    TCP名为传输控制协议,三次握手只是相比较来说保证了传输数据的可靠性,实际上任何协议多无法保证数据的完全可靠,三次握手通俗讲,发送方为A,接收方为B,第一次>>B知道自己可以接收到A发送的信息,第二次>>>A知道B可以接收到自己发送的信息,第三次>>双方确认完毕,A告诉B我们之间可以进行交流了

    四次挥手

    假设请求中断方为A,接收中断请求方为B.1>>A给B发送中断请求,2->>接收到中断请求后告诉A,你再等等我还没准备好,然后A继续等待,3->>发送消息给A我要断开连接了4->>A收到B的断开消息后,不信任,再次发送信息确认,若是B到信息则断开连接,没有则重传,此时A等到一段时间没有A的应答,知道B已经断开了,然后自己也断开连接

    OSI七层模型

    七层模型

    五层模型

     

    断开连接时反应到代码上:抛出异常/发送空内容;

    1. DHCP,自动位局域网内容电脑分配IP。
    2. 网关,路由器中连接交换机的口。
    3. IP,4个点分的十进制表示  192.11.111.11
    4. 子网掩码,
        IP: 192.168.13.99
        掩码:255.255.255.0                 
        将挡住的IP位数作为网段。
        未挡住的部分作为可变的值。
    5. 局域网/城域网/广域网 
    6. arp协议,ARP协议就是用来获取目标IP地址所对应的MAC地址的 
    7. DNS,域名解析,根据域名解析出IP 
    8. 端口,是为了将同一个电脑上的不同程序进行隔离。IP是找电脑,端口是找电脑上的程序,http网站默认端口:80 ;https网站默认端口:443,范围1 - 65535,一般8000
  • 相关阅读:
    keepalived两台机器同时出现vip问题
    consul概念及架构方式
    haproxy+keepalived
    Hadoop、Spark——完全分布式HA集群搭建
    hadoop集群+spark集群部署
    hadoop原理分析
    RedisCluster集群
    配置透明代理squid支持https与http
    kubernetes的Kubeproxy的iptables转发规则
    【转】阿里技术专家Java零售Saas岗位两个小时面试经验
  • 原文地址:https://www.cnblogs.com/jiaqi-666/p/9579188.html
Copyright © 2020-2023  润新知