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)

猜你喜欢

转载自www.cnblogs.com/msj513/p/9911236.html
今日推荐