• day33作业


     1.再次梳理 三次握手 四次挥手 面试出现频率高 
    三次握手:第一次客户端请求数据报文,第二次服务端确认客户端请求,发送确认信息和测试数据。第三次客户端收到服务端的请求,发送确认信息。正式建立连接。
    四次挥手:第一次挥手客户端发送关闭连接请求,第二次挥手:服务端发送到接受客户端的信息,第三次挥手:服务端发送确认断开连接信息,第四次挥手客户端确认信息完整。
     

    2.编写远程CMD程序 总结粘包问题的发生原因 表现形式 解决方案 并在代码中解决

    服务端

    import socket, subprocess, struct
    
    server = socket.socket()
    server.bind(("127.0.0.1", 3232))
    server.listen(5)
    
    client, addr = server.accept()
    
    while True:
        try:
            # 接受客户端发来的命令
            cmd = client.recv(1024).decode("utf-8")
            # 使用subprocess 管道来实现信息的发送
            if not cmd:  # linux 中异常关闭客户端就会自动关闭
                print("client closed")
                client.close()
                break
            p = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
            res = p.stdout.read() + p.stderr.read()
            res_len = len(res)
            # 将字符串封装成固定长度的字节
            send_len = struct.pack("i", res_len)
            # 发送了数据长度的表头
            client.send(send_len)
            client.send(res)
        except ConnectionResetError:  # 放置客户端擅自关闭,使得服务器崩溃
            print("客户端异常关闭")
            client.close()
            break
    # 关闭服务
    server.close()

    客户端

    import struct, socket
    
    client = socket.socket()
    client.connect(("127.0.0.1", 3232))
    while True:
        cmd = input(">>>:")
        if not cmd:
            continue
        if cmd == "q":
            break
        client.send(cmd.encode("utf-8"))
        res_len_bytes = client.recv(4)  # 数据表头的数据确定发送的数据的长度
        res_len = struct.unpack("i", res_len_bytes)[0]  # 获得数据的长度,正常返回值是一个(数字,)的元组
        data_len = 0  # 用来记录接受的长度
        data = b""
        while data_len < res_len:  # 多次接受数据,通过接受数据长度和发送表头的数据相比较
            res = client.recv(1024)
            data += res  # 最终数据
            data_len += len(res)  # 接受的长度
        print(data.decode("gbk"))
    
    client.close()

    3.简述什么是socket 有什么用

    socket是一个封装了网络协议的一个模块,可以使得程序员直接调用socket模块方便的使用,而不需要学习具体的网络协议的工作原理。

    4.默写 tcp模板程序 带循环的

    服务端

    import socket
    
    server = socket.socket()
    server.bind(("127.0.0.1",4321))
    server.listen(5)
    client,addr = server.accept()
    while True:
        try:
            data = client.recv(1024).decode("utf-8")
            if not data:
                print("客户端没有发送数据")
            send_data = data.upper()
            client.send(send_data.encode("utf-8"))
    
        except ConnectionResetError:
            print("客户端的连接")

    客户端

    import socket
    
    client = socket.socket()
    client.connect(("127.0.0.1",4321))
    
    while True:
        msg = input("请输入(exit  退出)")
        if not msg:
            continue
        if msg == "exit":
            client.close()
            break
        client.send(msg.encode("utf-8"))
        data = client.recv(1024).decode("utf-8")
        print(data)
  • 相关阅读:
    配置支持Basler的API函数的开发环境
    调用约定
    进程间通讯之 命名管道
    进程间通讯。
    使用结构体返回多个参数。
    目的:让目标程序在内存中只有一个实例
    数学问题
    机试二
    pycharm安装TensorFlow
    机器学习一
  • 原文地址:https://www.cnblogs.com/msj513/p/9911236.html
Copyright © 2020-2023  润新知