主要知识

'''
ip是一台机器在网络上的位置,arp协议
端口号 网络相关的程序才需要开一个端口,找到唯一的一个程序
IP协议网络层,tcp协议/udp协议传输层,arp协议数据链路层
网盘
文件的上传下载
server端和client端
登录 客户端登录 将用户名和密码发给服务端,服务端确认消息之后
上传下载
选择上传、下载
上传:选择要上传的文件路径,在server创建一个同名的空文件,cache
下载:选择好要下载的文件路径,在client端创建一个同名的空文件
'''


和控制台交互

# os.popen () , 执行所在系统的系统命令,得到系统命令的结果
import subprocess
res = subprocess.Popen(
'dir', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print('stdout', res.stdout.read().decode('gbk'))
print('stderr', res.stderr.read().decode('gbk'))


黏包问题

基于TCP的server端

# 基于tcp实现远程执行命令,在server端下发命令
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8000))
sk.listen()


conn, addr = sk.accept()
while 1:
cmd = input('>>>')
conn.send(cmd.encode('utf-8'))
ret = conn.recv(1024).decode('gbk')
print(ret)
conn.close()

sk.close()


基于TCP的client端

# 在client端接收命令你并执行
import socket
import subprocess
sk = socket.socket()
sk.connect(('127.0.0.1', 8000))

while 1:
cmd = sk.recv(1024).decode('gbk')
ret = subprocess.Popen(
cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

std_out = 'stdout'+(ret.stderr.read()).decode('gbk')
std_err = 'stderr'+(ret.stdout.read()).decode('gbk')
print(std_out)
print(std_err)
sk.send(std_out.encode('utf-8'))
sk.send(std_err.encode('utf-8'))
sk.close()
# 数据已经乱了
# 没接受完和接受多了,黏包现象


基于UDP的server端

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1', 8000))
msg, addr = sk.recvfrom(1024)
while 1:
cmd = input('>>>')
if cmd == 'q':
break
sk.sendto(cmd.encode('utf-8'), addr)
msg, addr = sk.recvfrom(1024)
print(msg.decode('utf-8'))

sk.close()


基于UDP的client端


import socket
import subprocess
sk = socket.socket(type=socket.SOCK_DGRAM)
addr = ('127.0.0.1', 8000)
sk.sendto('尝试连接'.encode('utf-8'), addr)
while 1:
cmd, addr = sk.recvfrom(1024)
if cmd.decode('utf-8') == 'q':
break
ret = subprocess.Popen(
cmd.decode('gbk'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

std_out = 'stdout'+(ret.stderr.read()).decode('gbk')
std_err = 'stderr'+(ret.stdout.read()).decode('gbk')
print(std_out)
print(std_err)
sk.sendto(std_out.encode('utf-8'), addr)
sk.sendto(std_err.encode('utf-8'), addr)
sk.close()
# udp不黏包,不可靠
# udp会丢包