码迷,mamicode.com
首页 > 编程语言 > 详细

python模块——socket (实现简单的C/S架构端通信操作CMD)

时间:2018-07-31 19:05:46      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:linu   pip   gbk   架构   bre   strip   continue   stderr   listen   

# 服务端代码
#
!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" import socket import subprocess server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ip_port = (127.0.0.1, 8011) server.bind(ip_port) server.listen(5) # 链接循环 while 1: print(Waiting...) conn, addr = server.accept() print(-->conn: , conn) print(-->addr: , addr) print(Got it...) while 1: try: cmd = conn.recv(1024) res = subprocess.Popen(cmd.decode(utf-8), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) conn.send(res.stdout.read()) conn.send(res.stderr.read()) except Exception: break conn.close() # server.close()

 

 

客户端
#
!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ip_port = (127.0.0.1, 8011) client.connect(ip_port) # 通信循环 while 1: # 发消息 cmd = input(>>: ).strip() if not cmd: continue client.send(bytes(cmd, encoding=utf-8)) # 收消息 data = client.recv(8196) print(data.decode(gbk)) # client.close()

 

以上代码是基于TCP 流的方式进行C/S控制,注意编码Linux适用于utf-8,Windows适用于gbk

已知BUG:

1.在接受的信息大于8196(或者你自己定义的值的时候)可能会出现粘包问题

2.执行可执行程序或者需要交互的cmd命令,client会宕住,需要重新开客户端

3.如果是作为纯py脚本使用还需要进行sys.platform的系统判断,如果是win采用编码gbk,linux采用编码utf-8

4.以上代码仅供学习参考使用

python模块——socket (实现简单的C/S架构端通信操作CMD)

标签:linu   pip   gbk   架构   bre   strip   continue   stderr   listen   

原文地址:https://www.cnblogs.com/Cong0ks/p/9396985.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!