from socket import *

  1. #以下是关于tcp:服务端 和 客户端的小例子#服务端socket_server = socket(AF_INET, SOCK_STREAM)
  2. socket_server.bind(('127.0.0.1', 8080))print('进行监听')socket_server.listen(5)
  3. while True: print('进行连接') conn, address = socket_server.accept() print('连接成功')
  4. while True: data=conn.recv(1024) if not len(data):break conn.send(data.upper()) print(data.decode(encoding='utf-8')) conn.close()
  5. socket_server.close()
  6. from socket import *import struct
  7. 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'))
  8. socket_client.close()
  9. #远程执行命令的小例子#服务端import socketimport osimport subprocessphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)print('进行绑定,监听')phone.bind(('127.0.0.1', 8080))phone.listen(5)
  10. def cmd(cmdlist): obj=subprocess.Popen( cmdlist, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
  11. stdout_res=obj.stdout.read() stderr_res=obj.stderr.read()
  12. return stdout_res+stderr_res#假如不写成方法,这里可以分成两次发送过去,更加节省内存
  13. while True: conn, add = phone.accept() print('建立连接')
  14. while True: try: msg = conn.recv(1024) if not len(msg): break
  15. print('执行命令') print(msg) #os.system(msg.decode(encoding='utf-8'))
  16. stdout_res=cmd(msg.decode(encoding='utf-8')) print('发送消息') conn.send(stdout_res) except Exception: break
  17. conn.close()phone.close()
  18. #客户端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
  19. st.send(msg.encode(encoding='utf-8')) data=st.recv(1024) print(data.decode('gbk'))
  20. st.close()

#获取服务端内容小例子

  1. from socket import *import structimport subprocessimport json
  2.  
  3. st = socket(AF_INET, SOCK_STREAM)print('绑定并且监听')st.bind(('127.0.0.1', 8080))st.listen(5)print('绑定监听成功')
  4.  
  5. while True: conn, _ = st.accept() print('与客户端建立连接成功')
  6.  
  7. 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()
  8.  
  9. total_size = len(sub_err) + len(sub_out) file_path = '为空' else: file_path = 'get.txt' import os
  10.  
  11. total_size = os.path.getsize(file_path)
  12.  
  13. header_dic = { 'file_name': file_path, 'total_size': total_size, 'hashlib': '还没有有开始写呢' }
  14.  
  15. header_json = json.dumps(header_dic) header_bytes = header_json.encode(encoding='utf-8')
  16.  
  17. conn.send(struct.pack('i', len(header_bytes))) # 将文件头的长度发送给客户端
  18.  
  19. conn.send(header_bytes) # 将文件头的内容发给客户端 if cmd == 'get': with open(file_path, 'rb') as f:
  20.  
  21. for line in f: conn.send(line) else: conn.send(sub_out) # 正常内容 conn.send(sub_err) # 错误消息
  22.  
  23. except ConnectionResetError: break
  24.  
  25. conn.close()
  26.  
  27. st.close()
  1. from socket import *import structimport subprocessimport json
  2.  
  3. st = socket(AF_INET, SOCK_STREAM)st.connect(('127.0.0.1', 8080))
  4.  
  5. print('与客户端建立连接')
  6.  
  7. while True: msg = input('请输入cmd命令:').strip() if not len(msg): continue st.send(msg.encode(encoding='utf-8'))
  8.  
  9. header_struct_len = st.recv(4)
  10.  
  11. header_len = (struct.unpack('i', header_struct_len))[0]
  12.  
  13. 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))
  14.  
  15. else: print(res.decode(encoding='gbk'))
  16.  
  17. 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. [Shell]Bash基本功能:历史命令 & 别名 & Bash快捷键

    /*----------------------------------------------------------------------------------------------- @黑 ...

  2. git工作操作步骤

    上班开始,打开电脑,git pull:拉取git上最新的代码: 编辑代码,准备提交时,git stash:将自己编辑的代码暂存起来,防止git pull时与库中的代码起冲突,否则自己的代码就白敲了: ...

  3. 收藏点webservice接口

    商业和贸易: 1.股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webxml.com.cn/WebSe ...

  4. 远程批量查看windosws操作系统3389端口的开放情况

    本文只提供思想.具体可以根椐情况拓展. 前提是需要配置远程主机的SNMP协议.主要是共同体哟. 脚本使用: 1.拷贝check_tcp到脚本执行的主机中或在此主机中安装nagios; 2.保持list ...

  5. LDA线性判别分析(转)

    线性判别分析LDA详解 1 Linear Discriminant Analysis    相较于FLD(Fisher Linear Decriminant),LDA假设:1.样本数据服从正态分布,2 ...

  6. 拓扑排序-有向无环图(DAG, Directed Acyclic Graph)

    条件: 1.每个顶点出现且只出现一次. 2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 一 ...

  7. VUE 关于理解$nextTick()的问题

    Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触 DOM.this.$nextTick()官方介绍:将回调延迟到下次 DOM 更新循环之后执行.在修改数据之后立即使用它,然后等待 ...

  8. js中的全局变量

    在js中有3中声明全局变量的方式 第一种使用var+变量名,在方法外部声明: var msg; //默认值undefined $(function(){ setmsg(); showmsg(); }) ...

  9. windows上java中文乱码-指定字符集 -Dfile.encoding=UTF-8

    jvm启动中增加参数: -Dfile.encoding=UTF-8 重启即可.

  10. 无法加载DLL"***.dll":找不到指定的模块

    加载dll的路径不对. 绝对路径不合适,可以换成相对路径. 比如: 把dll放入bin目录下的debug或者release下,然后就可以直接“test.dll”了.不用加路径了. 注意:路径必须与发布 ...