简单的socket程序

socket_server服务端

import socket,os

server = socket.socket()
server.bind(('localhost',9999))
# 监听socket
server.listen()

while True:
    # 接收客户端消息
    conn,addr = server.accept()
    print('new conn:',addr)
    while True:
        data = conn.recv(1024)
        # 判断数据是否为空
        if not data:
            print('客户端已断开!')
            break
        print('执行指令:',data)
        # 调用os的popen方法
        cmd_res = os.popen(data.decode()).read()
        print('before send',len(cmd_res))
        # 判断指令是否为空或者指令是否有效
        if len(cmd_res)==0:
            cmd_res = 'cmd has nor output'
        conn.send(cmd_res.encode('utf-8'))
        print('===========send done============')

server.close()

socket_client服务端

import socket

client = socket.socket()

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

while True:
    cmd = input('>>:').strip()
    # 不允许指令为空
    if len(cmd)==0:continue
    # 发送指令
    client.send(cmd.encode('utf-8'))
    # 接收服务端发送的数据
    cmd_res = client.recv(1024)
    print(cmd_res.decode('utf-8'))

client.close()

执行结果

服务端


客户端


 

BUG:

当执行ipconfig指令时,可以看到并没有返回完整的数据,这是因为指令结果数据大小超出了1024,(例如总数据为2024,第一次只发送了1024到client,剩下的保存到了缓冲区中,这样的话,在执行下一条数据的时候,会先把缓冲区的数据传送过去。)当缓冲区满了或者超时的时候会自动发到客户端

修改版

socket_server服务端

# -*- coding: utf-8 -*-
__author__ = 'leeho'
import socket,os

server = socket.socket()
server.bind(('localhost',9999))
# 监听socket
server.listen()

while True:
    # 接收客户端消息
    conn,addr = server.accept()
    print('new conn:',addr)
    while True:
        print('等待新指令')
        data = conn.recv(1024)
        # 判断数据是否为空
        if not data:
            print('客户端已断开!')
            break
        print('执行指令:',data)
        # 调用os的popen方法
        cmd_res = os.popen(data.decode()).read()
        print('before send',len(cmd_res))
        # 判断指令是否为空或者指令是否有效
        if len(cmd_res)==0:
            cmd_res = 'cmd has nor output'

        conn.send(str(len(cmd_res.encode())).encode('utf-8')) #先发送大小给客户端

        conn.send(cmd_res.encode('utf-8'))
        print('===========send done============')

server.close()


socket_client客户端

# -*- coding: utf-8 -*-
__author__ = 'leeho'
import socket

client = socket.socket()

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

while True:
    cmd = input('>>:').strip()
    # 不允许指令为空
    if len(cmd)==0:continue
    # 发送指令
    client.send(cmd.encode('utf-8'))
    # 接收服务端发送的数据
    cmd_re_size = client.recv(1024)
    print('命令结果大小:',cmd_re_size)
    received_size = 0
    received_data = b''
    while received_size < int(cmd_re_size.decode('utf-8')):
        data = client.recv(1024)
        received_size+=len(data) #每次收到的有可能小于1024,必须用len判断
        # print(data.decode('utf-8'))
        received_data+=data
    else:
        print('cmd res received done ...',received_size)
        print(received_data.decode('utf-8'))

client.close()
解决数据大小问题。


猜你喜欢

转载自blog.csdn.net/weixin_37224686/article/details/80956253