dos命令:一种面向磁盘的操作命令,主要包括目录操作类命令、磁盘操作类命令、文件操作类命令和其它命令。
例如:ping、nbtstat、dir、tracert等命令
客户端
# 客户端
import socket
# 使用TCP协议
client=socket.socket()
# 和服务端进行连接
client.connect(("localhost",9999))
# 客户端接收服务端发送的信息
data=client.recv(1024).decode("utf-8")
print(data)
# 开始持续和服务端进行通信
while True:
order=input(">>:").strip()
# 发送内容到服务端
client.send(order.encode("utf-8"))
# 做判断
if len(order)==0:
continue
elif order=="exit":
break
# 接收服务端发送的数据
rec_server_data=client.recv(1024)
print("数据大小:",rec_server_data.decode())
client.send("我已经收到数据包大小,可以发送了".encode("utf-8"))
size=0
# 定义一个二进制类型内容的变量,便于后续和数据拼接
rec_data=b""
# 开始循环接收数据
# 判断刚才接收的数据大小和正在接收的是否相等,相等就退出,说明已经接收完成了
while size!=int(rec_server_data.decode("utf-8")):
# 接收服务端真实发送的字符串结果
data_t=client.recv(1024)
# 收到的结果进行拼接
rec_data += data_t
# 开始增加size值,
size += len(data_t)
# 执行上面的循环,会继续执行else
else:
print("接受数据大小:",size)
print(rec_data.decode("utf-8"))
client.close()
服务器
# 服务端
import socket,os
# 使用TCP协议
service=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定地址和端口
service.bind(("127.0.0.1",9999))
# 开始监听
service.listen(5)
# 一直等待客户端的连接
while True:
# 服务端开始接收信息
conn,addr=service.accept()
print("客户端地址:{0},端口:{1}".format(addr[0], addr[1]))
print("客户端连接成功")
msg = "欢迎访问"
# 服务端给客户端发送信息
conn.send(msg.encode("utf-8"))
#给某个客户端一直保持通信
while True:
# 解码客户端发送的信息或者命令
data=conn.recv(1024).decode("utf-8")
print("执行指令:",data)
#判断客户端是否想要退出
if data == "exit" or len(data) == 0:
print("客户端:%s已断开连接"%str(addr))
break
# 在window的dos界面中执行命令,得到执行命令的结果
data_order=os.popen(data).read()#接受字符串,执行字符串
print("befor send",len(data_order.encode("utf-8"))) #将命令的结果编译成\xx\xx\xx,在进行统计字符数,结果中的汉字为三个字符
if len(data_order)==0:
data_order="cmd has no output"
# 给客户端发送命令的结果共有多少位
conn.send(str(len(data_order.encode("utf-8"))).encode("utf-8")) #发送大小给客户端, 不是str不能进行encode,最后的encode是为了将结果发送出去,对方能接受
#len(data_order.encode("utf-8")) 是计算编译成\xx\xx的字符数 str().encode(),是将结果编译成utf-8发送出去
#防止粘包
conn.recv(1024)
#真实发送命令结果返回的数据
conn.send(data_order.encode("utf-8"))
print("send done")
conn.close()
service.close()