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 socketimport osimport subprocessphone = 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 socketst = 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 structimport subprocessimport 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 structimport subprocessimport 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')

python tcp 粘包问题解决、文件下载等的更多相关文章

  1. python套接字解决tcp粘包问题

    python套接字解决tcp粘包问题 目录 什么是粘包 演示粘包现象 解决粘包 实际应用 什么是粘包 首先只有tcp有粘包现象,udp没有粘包 socket收发消息的原理 发送端可以是一K一K地发送数 ...

  2. Python全栈-网络编程-TCP粘包

    一.什么是TCP粘包 C/S架构下,接收方不知道每个消息的发送间隙.也不知道每次应该提取多少个字节的数据,与此同时,TCP是面向连接的,面向流的,收发两端都要有,因此发送端为了将多个发往接收端的数据包 ...

  3. netty之==TCP粘包/拆包问题解决之道(一)

    一.TCP粘包/拆包是什么 TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在 ...

  4. 百万年薪python之路 -- socket粘包问题解决

    socket粘包问题解决 1. 高大上版解决粘包方式(自定制包头) 整体的流程解释 整个流程的大致解释: 我们可以把报头做成字典,字典里包含将要发送的真实数据的描述信息(大小啊之类的),然后json序 ...

  5. Mina框架断包、粘包问题解决方式

    Mina框架断包.粘包问题解决方式 Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(当然.也能够提供JAVA 对象的序 ...

  6. c#解决TCP“粘包”问题

    一:TCP粘包产生的原理 1,TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾.出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能 ...

  7. 6行代码解决golang TCP粘包

    转自:https://studygolang.com/articles/12483 什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用golang的bufio.Scanner来实现 ...

  8. golang 解决 TCP 粘包问题

    什么是 TCP 粘包问题以及为什么会产生 TCP 粘包,本文不加讨论.本文使用 golang 的 bufio.Scanner 来实现自定义协议解包. 协议数据包定义 本文模拟一个日志服务器,该服务器接 ...

  9. Golang Tcp粘包处理(转)

    在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name" ...

随机推荐

  1. canvas入门笔记

    1.Canvas的使用注意  A.要在页面中添加一对canvas标记,默认占300*150的区域  B.我们可以通过html属性‘width’,‘height’来设置canvas的宽高,不可以通过cs ...

  2. DBCC维护语句语法

    一.DBCC维护语句:对数据库.索引或文件组进行维护的任务--1.DBCC CLEANTABLE,回收删除的可变长度列和文本列的空间 DBCC CLEANTABLE  ( { 'database_na ...

  3. 初识Swift中的值和引用,循坏引用、代理的注意点

    1.0 在Swift中分有值类型和引用类型 Int .String . 结构体和枚举都属于值类型, 将值类型传递给方法是,将在内存中创建其副本,并传递这个副本:这样我们就可以随心所欲修改它,而不用担心 ...

  4. 吴裕雄 18-MySQL GROUP BY 语句

    GROUP BY 语句根据一个或多个列对结果集进行分组.在分组的列上我们可以使用 COUNT, SUM, AVG,等函数.GROUP BY 语法SELECT column_name, function ...

  5. tensorflow serving 之minist_saved_model.py解读

    最近在学习tensorflow serving,但是就这样平淡看代码可能觉得不能真正思考,就想着写个文章看看,自己写给自己的,就像自己对着镜子演讲一样,写个文章也像自己给自己讲课,这样思考的比较深,学 ...

  6. python基础学习Day10 函数形参的动态参数、*args **kwargs 命名空间 global 与 nonlocal

    一.函数形参的动态参数 原因:为了拓展,对于实参数量不固定,故需要万能参数,即动态参数, *args   **kwargs # def sum1(*args): # 在函数定义时,在*位置参数,聚合. ...

  7. 我在eclipse输出的第一个hello world!

    下学期就要学习JAVA 语言,我现在对它好像还真的是一无所知.记得两次在帮学长做测评的时候,他们都说要装上eclipse.然后从放假我就忙着下载,安装,但是由于官网都是英文,似乎一直在出差错.询问了学 ...

  8. 大型运输行业实战_day01_1_业务分析

    1.业务分析 发展历史:  上车收费-->车站买票(相当于先收钱后上车)-->站务系统--->联网售票 2.项目结构 3.开发流程分析 1.业务分析            图文并茂  ...

  9. 基于oslo_log的日志管理

    oslo_log是openstack中的日志模块,其对python logging的封装,可以快速便捷地写出我们的日志模块.官网上有许多参考示例,但实例永远是实例,其配合oslo_config模块,快 ...

  10. mysql不能使用IP连接,可以使用localhost连接

    问题: 本地mysql,使用127.0.0.1可以连接成功,使用具体IP连接报错 ERROR 1130 (HY000): Host '10.252.225.125' is not allowed to ...