当前位置:
首页 > temp > 简明python教程 >
-
python基础(30):黏包、socket的其他方法(5)
('utf-8'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
err=res.stderr.read()
print(err)
if err:
back_msg=err
else:
back_msg=res.stdout.read()
conn.send(struct.pack('i',len(back_msg))) #先发back_msg的长度
conn.sendall(back_msg) #在发真实的内容
conn.close()
client:
- #_*_coding:utf-8_*_
- import socket,time,struct
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- res=s.connect_ex(('127.0.0.1',8080))
- while True:
- msg=input('>>: ').strip()
- if len(msg) == 0:continue
- if msg == 'quit':break
- s.send(msg.encode('utf-8'))
- l=s.recv(4)
- x=struct.unpack('i',l)[0]
- print(type(x),x)
- # print(struct.unpack('I',l))
- r_s=0
- data=b''
- while r_s < x:
- r_d=s.recv(1024)
- data+=r_d
- r_s+=len(r_d)
- # print(data.decode('utf-8'))
- print(data.decode('gbk')) #windows默认gbk编码
我们还可以把报头做成字典,字典里包含将要发送的真实数据的详细信息,然后json序列化,然后用struck将序列化后的数据长度打包成4个字节(4个自己足够用了)。
server:
- import socket
- import struct
- import json
- import subprocess
- import os
- class MYTCPServer:
- address_family = socket.AF_INET
- socket_type = socket.SOCK_STREAM
- allow_reuse_address = False
- max_packet_size = 8192
- coding='utf-8'
- request_queue_size = 5
- server_dir='file_upload'
- def __init__(self, server_address, bind_and_activate=True):
- """Constructor. May be extended, do not override."""
- self.server_address=server_address
- self.socket = socket.socket(self.address_family,
- self.socket_type)
- if bind_and_activate:
- try:
- self.server_bind()
- self.server_activate()
- except:
- self.server_close()
- raise
- def server_bind(self):
- """Called by constructor to bind the socket.
- """
- if self.allow_reuse_address:
- self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- self.socket.bind(self.server_address)
- self.server_address = self.socket.getsockname()
- def server_activate(self):
- """Called by constructor to activate the server.
- """
- self.socket.listen(self.request_queue_size)
- def server_close(self):
- """Called to clean-up the server.
- """
- self.socket.close()
- def get_request(self):
- """Get the request and client address from the socket.
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数