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()
网友评论