美文网首页
python socket实例

python socket实例

作者: 奔跑的老少年 | 来源:发表于2018-07-25 17:12 被阅读0次

socket_server_ssl.py文件:

import socket
import os

server = socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
    conn,addr = server.accept()
    print(conn,addr)
    while True:
        print('wait the next command coming')
        data = conn.recv(1024)#每次只接受100个字节,若客户端发送过来的文件超过1024,那么会在下次输入指令的时候再显示出来。如客户端输入ipconfig一次性接受不完,客户端再输入dir那么显示的仍是上次未显示完的ipconfig命令内容
        if not data:
            print('客户端已断开')
            break
        print('执行指令:',data)
        cmd_res = os.popen(data.decode()).read() #os.popen接收字符串,执行结果也是字符串
        print('befor send')
        if len(cmd_res) == 0:
            cmd_res = 'cmd_res has no output'
        conn.send(str(len(cmd_res.encode())).encode('utf-8'))#为解决不能一次将所有内容给客户端,先将内容大小告知客户端.先将cmd_res编码再计算len,否则汉字在编码前后的长度不一样
        client_ack = conn.recv(1024)#等客户端确认。第一个send后客户端还没收到结果第二个send就开始了,可能会造成两个send的数据在同一个包里(缓冲区满了才会发给客户端)造成粘包,所以等第一个send后客户端确认后再下一个send
        conn.send(cmd_res.encode('utf-8'))
        print('after send')

socket_client_ssl.py文件:

import socket
'''
客户端执行send命令后服务器会将内容存在缓冲区,默认等缓冲区满后如1024个字节就返回给客户端,若缓冲区未单已满等待超时也会返回给客户端
'''
client = socket.socket()
client.connect(('localhost',9999))
while True:
    cmd = input('>>:')#若字符串前面加上b则只是把字母转化为ASCII码,对中文无用
    if len(cmd) == 0:
        continue
    client.send(cmd.encode('utf_8'))#内容以bytes的格式发送
    cmd_res_size = client.recv(1024)#先接收文件总大小
    print('size-->',cmd_res_size)
    client.send('准备好接收了'.encode('utf-8'))
    received_size = 0
    received_data = b''
    while received_size < int(cmd_res_size.decode()):#只要接收到的总size小于文件总size就继续收
        cmd_res = client.recv(1024)
        received_size += len(cmd_res) #每次收到的内容长度可能不等于1024字节,所以必须用len判断
        print(cmd_res.decode())

    else:
        print('done')
client.close()

相关文章

网友评论

      本文标题:python socket实例

      本文链接:https://www.haomeiwen.com/subject/kmqmmftx.html