socket_简单报头
client---------------------
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2018/6/6 14:53
# @File : client1.py
import socket
import json
ip_port = ('127.0.0.1', 8080)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
res = s.connect_ex(ip_port)
while True:
msg = input('>>: ').strip()
if len(msg) == 0: continue
if msg == 'quit': break
s.send(msg.encode('utf-8'))
response_msg_header = s.recv(100).decode("utf-8")
response_msg_header_data = json.loads(response_msg_header)
msg_size = response_msg_header_data['length']
res = s.recv(msg_size)
print("received res size ", len(res))
print(res.decode('gbk'), end='')
server-------------------------------------
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2018/6/6 14:53
# @File : server1.py
import socket,json
import subprocess
ip_port = ('127.0.0.1', 8080)
t_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
t_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
t_server.bind(ip_port)
t_server.listen(5)
def pack_msg_head(header, size):
bytes_head = bytes(json.dumps(header), encoding='utf-8')
fill_up_size = size - len(bytes_head)
print('need to fillup ', fill_up_size)
header['fill'] = header['fill'].zfill(fill_up_size)
print('new header ', header)
bytes_new_header = bytes(json.dumps(header), encoding='utf-8')
return bytes_new_header
while True:
conn, addr = t_server.accept()
print('客户端 ', addr)
while True:
cmd = conn.recv(1024)
if len(cmd) == 0: break
print('recv cmd ', cmd)
res = subprocess.Popen(cmd.decode('utf-8'), shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
stderr = res.stderr.read()
stdout = res.stdout.read()
print('res len ', len(stdout))
msg_header = {
'length': len(stdout + stderr),
'fill': ' '
}
packed_header = pack_msg_head(msg_header, 100)
print('packed header size ', packed_header, len(packed_header))
conn.send(packed_header)
conn.send(stderr + stdout)
socket_简单报头的更多相关文章
- 网络编程——socket开发
Socket套接字方法 socket 实例类(8-10分钟) socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) ...
- python报头解决粘包简单实现
client------------- #!/usr/bin/env python # encoding: utf-8 # Date: 2018/6/5 import socketimport st ...
- socket上http协议应用(使用socket进行http通信的例子,准备好报头以后,简单read/write就可以了)
前几天看socket本有点晕, 好不容易弄明白了,才发现公司服务器用的是http的. 找了好久也没发现linux下直接用http的api, 不过今日偶然发现了使用socket进行http通信的例子, ...
- IP报头
位字段的值设置为二进制的0100表示IP版本4(IPv4).设置为0110表示IP版本6(IPv6) 位,它表示32位字长的IP报头长度,设计报头长度的原因是数据包可选字段大小会发生变化.IP ...
- squid介绍及其简单配置
squid的简单介绍 squid的概念 squid是一种用来缓存Internet数据的软件.接受来自人们需要下载的目标(object)的请求并适当的处理这些请求.也就是说,如果一个人想下载一web界面 ...
- Http协议与TCP协议简单理解
TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...
- HTTPS, SPDY和 HTTP/2性能的简单对比
中文原文:HTTPS, SPDY和 HTTP/2性能的简单对比 整理自:A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 请尊重版权, ...
- ASP.NET的SEO:HTTP报头状态码---内容重定向
本系列目录 我们经常说"404错误",你知道他指的是什么意思么? 404其实是Http报头所包含的一个"状态码",表明该Http请求失败.那么除此之外,还有哪些 ...
- ajax原理总结附简单实例及其优点
在工作中用了Ajax N多次了,也看过一些相关方面的书籍,也算是认识了它,但是一直没有认真总结和整理过相关的东东,失败! 近有闲情,将之总结如下: [名称] Ajax是Asynchronous Jav ...
随机推荐
- HTML深入探究(一)HTML入门
HTML:超文本标记语言HyperText Markup Language,是一种用于创建网页的标准标记语言.HTML 不是一种编程语言,而是一种标记语言,标记语言是一套标记标签 (mar ...
- SpringMVC注解@RequestMapping @RequestParam @ResponseBody 和 @RequestBody 解析
SpringMVC Controller层获取参数及返回数据的方式: @RequestMapping @RequestMapping(“url”),这里的 url写的是请求路径的一部分,一般作用在 C ...
- Spring Boot安装
Spring引导依赖项groupId使用org.springframework.boot. 通常Maven POM文件将继承自spring-boot-starter-parent项目,并将依赖性声明为 ...
- 雷林鹏分享:Ruby JSON
Ruby JSON 本章节我们将为大家介绍如何使用 Ruby 语言来编码和解码 JSON 对象. 环境配置 在使用 Ruby 编码或解码 JSON 数据前,我们需要先安装 Ruby JSON 模块.在 ...
- ASP.NET Page 指令
一些重要的Page指令 虽然Page公开了很多属性,让我们可以在运行时调整它的状态与行为,但是,还有些重要的参数却是以“指令”方式提供的,需要在设计时就指定.下面是我整理的一些我认为 比较重要并且经常 ...
- Linux下启动关闭weblogic
1. 启动主控域(必须永远先启动主控域) 首先,weblogic的启动脚本和关闭脚本都在域目录的bin文件夹下,所以,先cd到该目录 cd /home/weblogic/Oracle/Middlewa ...
- 【Python】operator 模块简单介绍
简单介绍几个常用的函数,其他的请参考文档. operator.concat(a, b) **operator.__concat__(a, b)** 对于 a.b序列,返回 a + b(列表合并) -- ...
- @pathVariable的作用
//url中的id 可通过@pathVariable绑定到函数的参数中
- java并发编程:线程安全管理类--原子操作类--AtomicLong
可以用原子方式更新的 long 值.有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范.AtomicLong 可用在应用程序中(如以原子方式增加的序列号), ...
- 转载:【Oracle 集群】RAC知识图文详细教程(九)--RAC基本测试与使用
文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...