# 服务端代码
#!/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.以上代码仅供学习参考使用

# 解决粘包问题的TCP版本 —— server

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "loki"
import socket
import subprocess
import struct
user_input = input('Please input server_ip: ').strip() ip_port = ('%s' % user_input, 9991)
buff_size = 1024 stick_pack_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
stick_pack_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) stick_pack_server.bind(ip_port)
stick_pack_server.listen(5) while 1:
print('Waiting...')
msg, address = stick_pack_server.accept()
print("msg-->: ", msg)
print("addr-->: ", address)
while 1:
try:
cmd = msg.recv(buff_size)
if not msg:
break
res = subprocess.Popen(cmd.decode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
stderr = res.stderr.read()
stdout = res.stdout.read() data_size = len(stderr) + len(stdout) # send header
msg.send(struct.pack("i", data_size)) # send real data
msg.send(stderr)
msg.send(stdout)
except Exception as e:
print('---->', e)
break
msg.close()
# phone.close()

# 解决粘包问题的TCP版本 —— client

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "loki"
import socket
import struct user_input = input("Please input client_ip: ").strip() ip_port = ('%s' % user_input, 9991)
buff_size = 1024 stick_pack_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
stick_pack_client.connect(ip_port) while 1:
# send message
cmd = input('>>: ').strip()
if not cmd:
continue
stick_pack_client.send(cmd.encode("utf-8")) # receive header
baotou = stick_pack_client.recv(4)
data_size = struct.unpack("i", baotou)[0] # receive data
receive_size = 0
receive_data = b''
while receive_size < data_size:
data = stick_pack_client.recv(1024)
receive_size += len(data)
receive_data += data print(receive_data.decode("gbk")) # stick_pack_client.close()

Wrap-up

1.注意tcp客户端需要使用 xx.connect()

2.注意tcp服务端发送消息是使用的accept,以及发送消息使用的是conn

python模块——socket (实现简单的C/S架构端通信操作CMD)的更多相关文章

  1. python模块介绍- HTMLParser 简单的HTML和XHTML解析器

    python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...

  2. Python模块 Socket

    一个简单的python socket编程 一.套接字 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并 ...

  3. python模块——socket

    实例一. server: #socket套接字(IP + 端口号)(qq,wechat 发送接收消息依靠socket模块),cs架构import socketserver = socket.socke ...

  4. Python模块:operator简单介绍

    Python官方文档地址:https://docs.python.org/3.6/library/operator.html?highlight=operator Operator提供的函可用于对象比 ...

  5. python模块—socket

    创建套接字: socket.socket(family,type[,protocal]) 使用给定的地址族.套接字类型.协议编号(默认为0)来创建套接字. 1. socket类型: socket.AF ...

  6. python开发socket套接字:套接字&通信循环&链接循环&模拟远程命令

    一,套接字 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket ...

  7. 扩展Python模块系列(二)----一个简单的例子

    本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...

  8. python实现socket通信

    python实现socket很简单,保证你的环境有响应的python环境就可以,我使用的是socket,demo代码如下: server端程序: # coding:utf-8 import socke ...

  9. python 模块和包深度学习理解

    python 模块和包 简单说相当于命名空间 1,python 模块        python模块就是一个文件,里面有函数,变量等 import 模块 模块.方法 from 模块 import fu ...

随机推荐

  1. 待解决:PDF header signature not found

  2. Redis 如何正确实现分布式锁

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  3. P4001 [BJOI2006]狼抓兔子(对偶图)

    P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...

  4. Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程

    Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程 原因: 一般造成这种原因是因为项目中有非守护线程的存在: 解决方案: 一.从Tomcat上解决 方案1:(推荐的方案:因为一台 ...

  5. mysql与oracle常用函数及数据类型对比00持续补充

    最近在转一个原来使用oracle,改为mysql的系统,有些常用的oracle函数的mysql实现顺便整理了下,主要是系统中涉及到的(其实原来是专门整理过一个详细doc的,只是每次找word麻烦). ...

  6. 20145313张雪纯Exp8 Web基础

    回答问题 (1)什么是表单 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域:包含了文本框. ...

  7. 20145318《网络对抗》Web安全基础实践

    20145318<网络对抗>Web安全基础实践 基础问题回答 1.SQL注入原理,如何防御 SQL注入 就是通过把SQL命令插入到“Web表单递交”或“输入域名”或“页面请求”的查询字符串 ...

  8. tf.multiply()和tf.matmul()区别

    (1)tf.multiply是点乘,即Returns x * y element-wise. (2)tf.matmul是矩阵乘法,即Multiplies matrix a by matrix b, p ...

  9. SVC(STM32)

    这两个都是 system level service,有什么区别呢?…… 手册上说 SVC 这个指令是同步的,而 PendSV 是异步的,请问是什么意思呢?…… 高手路过尽请留言啊

  10. codevs & vijos 爱在心中 - Tarjan

    描述 “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有 ...