首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >九、python学习笔记-网络编程-socket练习

九、python学习笔记-网络编程-socket练习

原创
作者头像
堕落飞鸟
发布2022-01-14 13:26:19
发布2022-01-14 13:26:19
4430
举报
文章被收录于专栏:飞鸟的专栏飞鸟的专栏

socket版远程执行命令client端

代码语言:javascript
复制
import socket


sk = socket.socket()            # 初始化sk对象
address = ('127.0.0.1', 8088)   # 服务器端地址
sk.connect(address)     # 连接服务器端
while True:         # 循环,连续发送信息
    inp = input(">>>>>")    # 输入要执行的命令
    sk.sendall(bytes(inp, encoding='utf8'))     # 发送命令,sendall只能发送bytes类型
    if inp == 'exit':   # 输入exit,退出连接
        break
    result = bytes()    # result初始值为空的bytes类型
    len_result = int(str(sk.recv(1024), encoding='utf8'))   # 接收返回结果长度
    sk.sendall(bytes('ok', encoding='utf8'))    # 确认接收,向服务端发送确认消息,防止粘包,一发一收
    while len(result) != len_result:    # 循环接收命令执行结果,单次接收最大1024字节,循环条件:已接收的长度 != 返回结果长度,长度一致表明已经全部接收,不再接收
        data = sk.recv(1024)    # 接收数据,最大1024
        result += data      # result = result+data
    result = str(result, encoding='gbk')    # 将结果转化为字符串
    print(result)   # 打印结果

sk.close()  # 关闭连接

socket版远程执行命令server端

代码语言:javascript
复制
import socket
import subprocess


sk = socket.socket()    # 初始化sk对象
address = ('127.0.0.1', 8088)   # 设置ip端口
sk.bind(address)    # 绑定ip端口
sk.listen(5)       # 最大连接数
while True:     # 循环监听,确保一个连接断开后服务端继续运行
    conn, addr = sk.accept()    # 初始化连接,addr获取远端地址,进入等待
    print('waiting......')
    while True:     # 子循环,用于可客户端信息交互
        try:    # 捕获异常,客户端中断后,退出子循环,等待下次连接
            data = str(conn.recv(1024), encoding='utf8')       # 正常获取data,继续执行,报错则走except捕获异常退出
        except Exception as e:
            print(e)    # 打印异常
            break   # 退出子循环
        if data == 'exit':      # 如果客户端输入为exit,跳出循环
            break
        print("执行命令:{}".format(data))   # 打印客户端要在服务器端执行的命令
        cmd_recv = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)   # 执行命令,将标准输出,标准错误输出,打印到主线程
        cmd_result = cmd_recv.stdout.read()     # 获取标准输出,类型是bytes
        cmd_result_err = cmd_recv.stderr.read()     # 获取标准错误输出,类型是bytes
        if str(cmd_result, encoding='gbk') != '':   # 判断标准输入是否存在
            result = cmd_result     # 存在,result等于标准输出,bytes类型
        else:
            result = cmd_result_err     # 不存在,result等于标准错误输出,bytes类型
        len_result = bytes(str(len(result)), encoding='utf8')   # 获取result长度,转化为bytes类型,sendall只能发送bytes类型
        conn.sendall(len_result)        # 发送长度
        status = str(conn.recv(1024), encoding='utf8')      # 接收客户端返回,两个连续sendall之间增加recv进行阻塞,防止粘包
        conn.sendall(result)        # 发送命令执行结果,result是标准输出或标准错误输出,本身就是bytes类型
    conn.close()    # 关闭连接

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档