windows下,python基于SocketServer模拟实现SSH(多线程版)
2015-06-29 08:50
771 查看
这两天,学习了python的套接字编程(linux版),我发现好多的资料都是linux的,然而python这个利器显然是跨平台的,所以,我根据linux版的资料来写一点windows的东西,希望对大家有点帮助,另外:本人小菜菜一枚,要是哪里有问题,欢迎指正,谢谢合作。
首先分析一下大概过程:
一、建立连接后,(多个或者一个)客户端将命令行发给服务器;
二、服务器收到命令行后,执行命令;
三、服务器将执行的结果反馈给客户端;
四、多次执行上述过程;
那么,python是怎么解决这几个问题的呢?
一、连接部分,由于服务器端需要同时处理多个客户端的请求,所以需要用到多线程的并发操作,python提供SocketServer来解决服务器多线程问题,对于客户端,用python提供的单线程socket就可以进行收发数据了;
二、执行发过来的命令,python提供了一个os这个模块来解决(linux使用commads模块),具体来说,由于我们需要将返回的数据发回客户端,所以需要使用cmd_result = os.popen("命令").read()。
三、由第二点可知:显然,我们需要返回客户端的是cmd_result。
四、要多次执行,可以使用python的循环来执行;
注:大概过程以及python解决方案已经分析完了,但是,对于程序的细节,比如,使用sendall()可以一次发送所有数据,要是使用send()可能需要对数据的循环发送;再比如,对数据判空语句,以及python的语法,这里笔者就不啰嗦了,要是有疑问,欢迎留言讨论,或者自行百度解决,下面是代码:
服务器:
#server
import SocketServer, os
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
while True:
self.data = self.request.recv(1024).strip()
print "{}wrote:".format(self.client_address[0])
if not self.data:
print "clilent %s is dead!" % self.client_address[0]
break
cmd_result = os.popen(self.data).read();
if len(cmd_result.strip()) != 0:
self.request.sendall(cmd_result)
else:
self.request.sendall('Not found the command:' + self.data)
if __name__ == "__main__":
HOST, PORT = "127.0.0.1", 3333
server = SocketServer.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
客户端:
#client
import socket
HOST = "127.0.0.1"
PORT = 3333
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while 1:
cmd = raw_input('Your command:').strip()
s.sendall(cmd)
result = s.recv(1024)
print result
s.close()
首先分析一下大概过程:
一、建立连接后,(多个或者一个)客户端将命令行发给服务器;
二、服务器收到命令行后,执行命令;
三、服务器将执行的结果反馈给客户端;
四、多次执行上述过程;
那么,python是怎么解决这几个问题的呢?
一、连接部分,由于服务器端需要同时处理多个客户端的请求,所以需要用到多线程的并发操作,python提供SocketServer来解决服务器多线程问题,对于客户端,用python提供的单线程socket就可以进行收发数据了;
二、执行发过来的命令,python提供了一个os这个模块来解决(linux使用commads模块),具体来说,由于我们需要将返回的数据发回客户端,所以需要使用cmd_result = os.popen("命令").read()。
三、由第二点可知:显然,我们需要返回客户端的是cmd_result。
四、要多次执行,可以使用python的循环来执行;
注:大概过程以及python解决方案已经分析完了,但是,对于程序的细节,比如,使用sendall()可以一次发送所有数据,要是使用send()可能需要对数据的循环发送;再比如,对数据判空语句,以及python的语法,这里笔者就不啰嗦了,要是有疑问,欢迎留言讨论,或者自行百度解决,下面是代码:
服务器:
#server
import SocketServer, os
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
while True:
self.data = self.request.recv(1024).strip()
print "{}wrote:".format(self.client_address[0])
if not self.data:
print "clilent %s is dead!" % self.client_address[0]
break
cmd_result = os.popen(self.data).read();
if len(cmd_result.strip()) != 0:
self.request.sendall(cmd_result)
else:
self.request.sendall('Not found the command:' + self.data)
if __name__ == "__main__":
HOST, PORT = "127.0.0.1", 3333
server = SocketServer.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
客户端:
#client
import socket
HOST = "127.0.0.1"
PORT = 3333
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while 1:
cmd = raw_input('Your command:').strip()
s.sendall(cmd)
result = s.recv(1024)
print result
s.close()
相关文章推荐
- Python学习笔记-遍历文件
- PAT Maximum subsequence sum (Python)
- PAT Shuffling machine (Python)
- PAT Have fun with numbers (Python)
- PAT 数组元素循环右移问题 (Python)
- PAT 素数对猜想 (Python)
- PAT 打印沙漏 (Python)
- Scrapy:Python的爬虫框架
- hadoop 流streaming跑python程序
- Python访问纯真IP数据库脚本分享
- 编写Python CGI脚本的教程
- Python数据类型之字典
- Python数据类型之元组
- PAT 最大子列和问题 (Python)
- Python数据类型之列表
- Python字符串处理
- python3.x与python2.x不同点
- python __init__.py
- python遇到的问题解决方法的记录
- python设计经典Pong 游戏