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)