使用socket编写客户端和服务器的dos命令通信

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()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值