python tcp 已经 粘包问题解决、文件下载等

from socket import *

#以下是关于tcp:服务端 和 客户端的小例子
#服务端
socket_server = socket(AF_INET, SOCK_STREAM)

socket_server.bind(('127.0.0.1', 8080))
print('进行监听')
socket_server.listen(5)

while True:
print('进行连接')
conn, address = socket_server.accept()
print('连接成功')

while True:
data=conn.recv(1024)
if not len(data):break
conn.send(data.upper())
print(data.decode(encoding='utf-8'))
conn.close()

socket_server.close()


from socket import *
import struct

socket_client = socket(AF_INET, SOCK_STREAM)
print('进行连接')
socket_client.connect(('127.0.0.1', 8080))
print('连接成功')
while True:
msg = input('请输入')
if not len(msg): continue
socket_client.send(msg.encode(encoding='utf-8'))
data =socket_client.recv(1024)
print(data.decode(encoding='utf-8'))

socket_client.close()


#远程执行命令的小例子
#服务端
import socket
import os
import subprocess
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('进行绑定,监听')
phone.bind(('127.0.0.1', 8080))
phone.listen(5)

def cmd(cmdlist):
obj=subprocess.Popen(
cmdlist,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)

stdout_res=obj.stdout.read()
stderr_res=obj.stderr.read()

return stdout_res+stderr_res#假如不写成方法,这里可以分成两次发送过去,更加节省内存

while True:
conn, add = phone.accept()
print('建立连接')

while True:
try:
msg = conn.recv(1024)
if not len(msg):
break

print('执行命令')
print(msg)
#os.system(msg.decode(encoding='utf-8'))

stdout_res=cmd(msg.decode(encoding='utf-8'))
print('发送消息')
conn.send(stdout_res)
except Exception:
break

conn.close()
phone.close()


#客户端
import socket
st = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
st.connect(('127.0.0.1', 8080))
while True:
msg=input('请输入cmd 命令').strip()
print('发送消息')
if not len(msg):continue

st.send(msg.encode(encoding='utf-8'))
data=st.recv(1024)
print(data.decode('gbk'))

st.close()

 #获取服务端内容小例子

from socket import *
import struct
import subprocess
import json

st = socket(AF_INET, SOCK_STREAM)
print('绑定并且监听')
st.bind(('127.0.0.1', 8080))
st.listen(5)
print('绑定监听成功')

while True:
conn, _ = st.accept()
print('与客户端建立连接成功')

while True:
try:
cmd = conn.recv(1024)
if not len(cmd): break
cmd = cmd.decode(encoding='utf-8')
if cmd != 'get':
obj_sub = subprocess.Popen(cmd,
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
sub_out = obj_sub.stdout.read()
sub_err = obj_sub.stderr.read()

total_size = len(sub_err) + len(sub_out)
file_path = '为空'
else:
file_path = 'get.txt'
import os

total_size = os.path.getsize(file_path)

header_dic = {
'file_name': file_path,
'total_size': total_size,
'hashlib': '还没有有开始写呢'
}

header_json = json.dumps(header_dic)
header_bytes = header_json.encode(encoding='utf-8')

conn.send(struct.pack('i', len(header_bytes))) # 将文件头的长度发送给客户端

conn.send(header_bytes) # 将文件头的内容发给客户端
if cmd == 'get':
with open(file_path, 'rb') as f:

for line in f:
conn.send(line)
else:
conn.send(sub_out) # 正常内容
conn.send(sub_err) # 错误消息

except ConnectionResetError:
break

conn.close()

st.close()



from socket import *
import struct
import subprocess
import json

st = socket(AF_INET, SOCK_STREAM)
st.connect(('127.0.0.1', 8080))

print('与客户端建立连接')

while True:
msg = input('请输入cmd命令:').strip()
if not len(msg):
continue
st.send(msg.encode(encoding='utf-8'))

header_struct_len = st.recv(4)

header_len = (struct.unpack('i', header_struct_len))[0]

header_json_dic = st.recv(header_len) # 拿到文件头
header_dic = header_json_dic.decode(encoding='utf-8')
header_dic = json.loads(header_dic)
print(header_dic)
res = b''
while header_dic['total_size'] > 0:
data = st.recv(1024)
header_dic['total_size'] -= len(data)
res += data
# print(data.decode(encoding='gbk'))
print('msg')
if msg == 'get':
print(res.decode(encoding='utf-8'))
#print(res)
print(type(res))

else:
print(res.decode(encoding='gbk'))

st.close()
print('error')

猜你喜欢

转载自www.cnblogs.com/yanxiatingyu/p/9287010.html
今日推荐