注意:本例所有代码均在windows平台下实现,如果是Linux或者Mac os下可能会存在诧异并产生一定问题。
因此:如果需要测试请在windows平台下进行。
首先来看客户端实现代码:

import socket

client = socket.socket()
client.connect(('localhost',9999))

while True:
    msg = input('>>:').strip()
    if len(msg) == 0: continue
    client.send(msg.encode('utf-8'))
    data_rev_size = client.recv(1024) #接收命令的大小
    print(data_rev_size)
    client.send('已经准备好接收数据了。'.encode('utf-8'))
    re_size = 0
    re_data = b''
    while re_size != int(data_rev_size.decode()):
        data_rev = client.recv(1024)
        re_size += len(data_rev)
        print(re_size)
        re_data += data_rev
    print(re_data.decode())

client.close()

然后再来看服务端代码:

import socket
import os

import time

server = socket.socket()
server.bind(('localhost',9999))
server.listen(5)

while True:
    con,addr = server.accept()
    while True:
        try:
            data = con.recv(10240)  # 接收数据
            cmd_res = os.popen(data.decode()).read()
            # print(cmd_res)
            if len(cmd_res) == 0:
                cmd_res = 'This commit is not recve'
            con.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8')) #先大大小给客户端
            # time.sleep(0.5)  #这个是为了避免数据粘包的情况,直接等待0.5s
            # 使得它超时,然后直接执行下一条命令
            # 但正常不能这样
            sure = con.recv(1024) #最新的解决粘包的问题
            print(sure.decode())
            con.send(str(cmd_res).encode('utf-8')) #再把命令返回给客户端
        except ConnectionResetError as e:
            print('客户端已经断开!')
            break
    con.close()

server.close()

这里测试的话,请先运行服务端代码,然后运行客户端代码,
然后输入windows命令进行测试,如dir、ipconfig、pwd等

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐