socket python 收 发 线程_windows下,python基于SocketServer模拟实现SSH(多线程版)

标签:

这两天,学习了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()

标签:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值