Python入门学习-DAY32-链接循环与通信循环,粘包问题,远程控制,文件上传与下载

链接循环与通信循环

服务端

from socket import *

IP = ‘127.0.0.1‘
PORT = 8181
ADDRESS = (IP, PORT)
BUFSIZE = 1024

server = socket(AF_INET, SOCK_STREAM)

server.bind(ADDRESS)

server.listen(5)
tag=True
while tag:
    conn, addr = server.accept()
    while tag:
        try:
            data = conn.recv(BUFSIZE)
            if not data:
                print(‘服务端断开。。。‘)
                break
            print(‘>>>>‘,data.decode(‘utf-8‘))
            conn.send(‘收到‘.encode(‘utf-8‘))
        except ConnectionResetError:
            break
    conn.close()
server.close()

客户端

import  socket
IP=‘127.0.0.1‘
PORT=8181
ADDRESS=(IP,PORT)
BUFSIZE=1024

client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

client.connect(ADDRESS)
while True:

    msg=input(‘>>>‘)
    if len(msg) == 0: continue
    client.send(msg.encode(‘utf-8‘))
    data=client.recv(BUFSIZE)

    print(data.decode(‘utf-8‘))

client.close()

远程控制

服务端

import socket
import subprocess
IP = ‘192.168.13.126‘
PORT = 8282
ADDRESS = (IP, PORT)
BUFSIZE = 1024

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind(ADDRESS)

server.listen(5)
tag=True
while tag:
    conn, addr = server.accept()
    while tag:
        try:
            data = conn.recv(BUFSIZE)
            if not data:
                print(‘服务端断开。。。‘)
                break
            #获取sub对象
            res = subprocess.Popen(data.decode("utf-8"),
                                   shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
            print(‘>>>>‘,data.decode(‘utf-8‘))
            stdout=res.stdout.read()
            stderr=res.stderr.read()

            conn.send(stdout+stderr)
        except ConnectionResetError:
            break
    conn.close()
server.close()

客户端

import  socket
IP=‘127.0.0.1‘
PORT=8282
ADDRESS=(IP,PORT)
BUFSIZE=1024

client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

client.connect(ADDRESS)
while True:

    msg=input(‘>>>‘)
    if len(msg) == 0: continue
    client.send(msg.encode(‘utf-8‘))
    data=client.recv(BUFSIZE)

    print(data.decode(‘gbk‘))

client.close()

粘包问题

服务端

import socket
import subprocess
import struct
import json

IP = ‘127.0.0.1‘
PORT = 8383
ADDRESS = (IP, PORT)
BUFSIZE = 1024

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind(ADDRESS)

server.listen(5)
tag = True
while tag:
    conn, addr = server.accept()
    while tag:
        try:
            data = conn.recv(BUFSIZE)
            if not data:
                print(‘服务端断开。。。。‘)
                break
            # 获取sub对象
            res = subprocess.Popen(data.decode("utf-8"),
                                   shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
            print(‘>>>>‘, data.decode(‘utf-8‘))
            # 成功的结果
            stdout = res.stdout.read()
            # 失败的结果
            stderr = res.stderr.read()

            # 1.制作报头
            header_dic = {
                ‘filename‘: ‘a.txt‘,
                ‘md5‘: ‘sd7a86d87sad6as‘,
                ‘total_size‘: len(stdout) + len(stderr)
            }
            header_json = json.dumps(header_dic)
            header_bytes = header_json.encode(‘utf-8‘)

            # 2.先发送报头长度
            conn.send(struct.pack(‘i‘, len(header_bytes)))

            # 3.再发送报头
            conn.send(header_bytes)

            # 4.最后发送数据
            conn.send(stdout)
            conn.send(stderr)
        except ConnectionResetError:
            break
    conn.close()
server.close()

客户端

import socket
import struct
import json
IP = ‘127.0.0.1‘
PORT = 8383
ADDRESS = (IP, PORT)
BUFSIZE = 1024

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect(ADDRESS)
while True:

    msg = input(‘>>>‘)
    if len(msg) == 0: continue
    client.send(msg.encode(‘utf-8‘))

    # 1.先获取报头长度
    header_size = struct.unpack(‘i‘,client.recv(4))[0]

    #2.在获取报头
    header_bytes=client.recv(header_size)
    header_json=header_bytes.decode(‘utf-8‘)
    header_dic=json.loads(header_json)
    print(header_json)
    total_size=header_dic[‘total_size‘]

    # 3.在获取真正数据
    cmd_res=b‘‘
    recv_size=0
    while recv_size<total_size:
        data=client.recv(1024)
        recv_size+=len(data)
        cmd_res+=data
    print(cmd_res.decode(‘gbk‘))

client.close()

文件上传与下载

common

import json, struct, os

def accept(type, obj):
    res = obj.recv(1).decode(‘utf-8‘)
    if res == ‘1‘:
        # 1.先获取报头长度
        header_size = struct.unpack(‘i‘, obj.recv(4))[0]
        # 2.在获取报头
        header_bytes = obj.recv(header_size)  # 接受字节型的报头
        header_json = header_bytes.decode(‘utf-8‘)  # 将字节型的报头转化为原先的JSON格式
        header_dic = json.loads(header_json)  # 将JSON格式的报头转化为原先的字典
        total_size = header_dic[‘total_size‘]
        print(header_dic)
        # 3.在获取真正数据
        recv_size = 0
        # 设置存放文件的路径
        if type == ‘server‘:
            file_path = os.path.join(r‘C:\Users\Administrator\Desktop\服务端文件中心\%s‘ % header_dic[‘filename‘])
        elif type == ‘client‘:
            file_path = os.path.join(r‘C:\Users\Administrator\Desktop\客户端文件中心\%s‘ % header_dic[‘filename‘])
        # 判断文件内容是否为空
        if total_size != 0:
            while (recv_size < total_size):
                data = obj.recv(10240)
                recv_size += len(data)
                with open(file_path, ‘wb‘) as f:
                    f.write(data)
        else:
            f = open(file_path, ‘wb‘)
            f.close()
        return True
    else:
        return False

def transfer(obj, filename):
    if os.path.exists(filename):
        obj.send(‘1‘.encode(‘utf-8‘))
        filepath, tempfilename = os.path.split(filename)
        # 1.制作报头
        header_dic = {
            ‘filename‘: tempfilename,
            ‘total_size‘: os.stat(filename).st_size
        }
        header_json = json.dumps(header_dic)#将字典格式序列化为json方便传送
        header_bytes = header_json.encode(‘utf-8‘)#只能传送bytes类型,所以要转化为bytes类型
        print(header_dic)
        # 2.先发送报头长度
        obj.send(struct.pack(‘i‘, len(header_bytes)))

        # 3.再发送报头
        obj.send(header_bytes)

        # 4.最后发送数据
        with open(filename, ‘rb‘) as f:
            for i in f:
                obj.send(i)
        return True
    else:
        obj.send(‘0‘.encode(‘utf-8‘))
        return False

服务端

import socket
import common

def run():
    IP = ‘127.0.0.1‘
    PORT = 8484
    ADDRESS = (IP, PORT)
    BUFSIZE = 1024
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(ADDRESS)
    server.listen(5)
    tag = True
    while tag:
        conn, addr = server.accept()
        while tag:
            try:
                data = conn.recv(BUFSIZE)
                if not data:
                    print("客户端已断开。。。")
                    break
                cmd, filename = data.decode("utf-8").split( )
                print(‘>>>>‘, data.decode(‘utf-8‘))
                if cmd==‘1‘:
                    flag=common.accept(‘server‘,conn)
                    if flag:
                        print(‘接受成功‘)
                    else:
                        print(‘接受失败‘)
                elif cmd==‘2‘:
                    flag=common.transfer(conn, filename)
                    if flag:
                        print(‘传送成功‘)
                    else:
                        print(‘传送失败‘)
            except ConnectionResetError:
                break
        conn.close()
    server.close()

run()

客户端

import socket
import common

def run():
    IP = ‘127.0.0.1‘
    PORT = 8484
    ADDRESS = (IP, PORT)
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(ADDRESS)
    print(‘‘‘
    1.上传
    2.下载
            ‘‘‘)
    while True:
        msg = input(‘>>>(1/2):‘)
        if len(msg) == 0: continue
        if msg!=‘1‘ and msg!=‘2‘:
            print(‘指令错误‘)
            continue
        filename=input(‘文件地址:‘)
        client.send((msg+‘ ‘+filename).encode(‘utf-8‘))
        if msg == ‘1‘:
            flag=common.transfer(client, filename)
            if flag:
                print(‘上传成功‘)
            else:
                print(‘上传失败‘)
        elif msg == ‘2‘:
            flag=common.accept(‘client‘,client)
            if flag:
                print(‘下载成功‘)
            else:
                print(‘下载失败‘)

    client.close()

run()

原文地址:https://www.cnblogs.com/xvchengqi/p/9580067.html

时间: 2024-11-08 19:18:57

Python入门学习-DAY32-链接循环与通信循环,粘包问题,远程控制,文件上传与下载的相关文章

JavaWeb学习总结(五十)——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

JavaWeb学习总结,文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

Struts2学习总结——文件上传与下载

Struts2文件上传与下载 1.1.1新建一个Maven项目(demo02) 在此添加Web构面以及 struts2 构面 1.2.1配置Maven依赖(pom.xml 文件) <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20

JavaWeb学习总结(五十)——文件上传和下载 http://www.cnblogs.com/xdp-gacl/p/4200090.html

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

JavaWeb学习总结——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

Spring Boot入门——文件上传与下载

Spring Boot入门--文件上传与下载https://www.cnblogs.com/studyDetail/p/7003253.html 1.在pom.xml文件中添加依赖 复制代码 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/

Javaweb学习笔记10—文件上传与下载

 今天来讲javaweb的第10阶段学习.文件的上传与下载,今天主要说的是这个功能的实现,不用说了,听名字就是外行人也知道肯定很重要啦. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下载 另外:如果图看不清的话请右击---在新窗口中打开会清楚很多 一*, 文件的上传:      1 *分析实现步骤: 1.1* 客户端浏览器通过文件域选择本地要上传的文件. * 点击"上传"按钮

Struts2学习(八)—文件上传和下载

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的实现进行一下讲解,这里 我们使用的struts2 web项目所导入的jar包中的**commons-fileupload-1.3.1.jar commons-io-

Struts学习之 实现文件上传、下载操作

一.Struts-cofig.xml流程图 二.register.jsp页面文件 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1