Python Socket编程详细介绍
发布时间 - 2026-01-11 00:19:59 点击率:次在使用Python做socket编程时,由于需要使用阻塞(默认)的方式来读取数据流,此时对于数据的结束每次都需要自己处理,太麻烦。并且网上也没找到太好的封装,所以就自己写了个简单的封装。

封装思路
1. 客户端每次请求均发送一个 SocketRequest 对象,其中封装具体的数据,这里使用json。对于要发送的数据,会自动添加一个结束符标识(EOF = ‘0x00')。
2. 服务器端接收数据时,根据结束符标识来生成完整的数据,并解包成 SocketRequest 对象。
3. 服务器端根据 SocketRequest 的内容,来生成 SocketResponse 对象,这里使用了一个 SimpleRequestHandler 类来处理,例子中就是没有做任何处理,然后原样返回。
4. 服务器端发送 SocketResponse 给客户端。其中也需要对包做一个封装,会自动添加一个结束符标识(EOF = ‘0x00')。
5. 客户接收数据时,根据结束符标识来生成完整的数据,并解包成 SocketResponse 对象,然后返回。
封装类
sockets.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import pickle
import thread
PORT = 12345
EOF = '0x00'
class SocketServer(object):
def __init__(self, port=None):
self.port = port
def startup(self):
sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_server.bind(('0.0.0.0', self.port))
sock_server.listen(0)
while True:
sock, address = sock_server.accept()
thread.start_new_thread(self.__invoke, (sock, address))
def shutdown(self):
pass
def __invoke(self, sock, address):
try:
full_data = ''
while True:
data = sock.recv(1024)
if data is None:
return
full_data += data
if full_data.endswith(EOF):
full_data = full_data[0:len(full_data) - len(EOF)]
request = pickle.loads(full_data)
response = SimpleRequestHandler().handle(request)
sock.sendall(pickle.dumps(response) + EOF)
return
except Exception as e:
print e
finally:
sock.close()
class SocketClient(object):
def __init__(self, host, port):
self.host = host
self.port = port
def execute(self, request):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((self.host, self.port))
try:
sock.sendall(pickle.dumps(request) + EOF)
full_data = ''
while True:
data = sock.recv(1024)
if data:
full_data += data
if full_data.endswith(EOF):
full_data = full_data[0:len(full_data) - len(EOF)]
response = pickle.loads(full_data)
return response
else:
return None
except Exception as e:
print e
return None
finally:
sock.close()
class SocketRequest(object):
def __init__(self, data):
self.data = data
def __repr__(self):
return repr(self.__dict__)
class SocketResponse(object):
def __init__(self, data):
self.data = data
def __repr__(self):
return repr(self.__dict__)
class SimpleRequestHandler(object):
def __init__(self):
pass
def __repr__(self):
return repr(self.__dict__)
def handle(self, request):
return SocketResponse(request.data)
测试
socket_server.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from agent.sockets import * ss = SocketServer(PORT) ss.startup()
socket_client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pickle
from agent.sockets import *
sc = SocketClient('localhost', PORT)
request = SocketRequest('abc')
response = sc.execute(request)
print request
print response
运行测试
首先,运行 socket_server.py
然后,运行 socket_client.py
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Python
# Socket
# Socket编程
# Python 网络编程起步(Socket发送消息)
# Python socket编程实例详解
# 最基础的Python的socket编程入门教程
# python多线程socket编程之多客户端接入
# Python Socket编程入门教程
# 详解Python Socket网络编程
# python之Socket网络编程详解
# python网络编程学习笔记(五):socket的一些补充
# 关于Python Socket编程的要点详解
# 客户端
# 也没
# 做一个
# 写了
# 要对
# 每次都
# 太好
# 大家多多
# 也需
# 使用了
# 网上
# env
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
如何安全更换建站之星模板并保留数据?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
如何快速启动建站代理加盟业务?
php 三元运算符实例详细介绍
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
实例解析angularjs的filter过滤器
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
Laravel如何使用Collections进行数据处理?(实用方法示例)
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
高防服务器租用指南:配置选择与快速部署攻略
WordPress 子目录安装中正确处理脚本路径的完整指南
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
个人摄影网站制作流程,摄影爱好者都去什么网站?
Python高阶函数应用_函数作为参数说明【指导】
JavaScript如何实现音频处理_Web Audio API如何工作?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Python3.6正式版新特性预览
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
使用C语言编写圣诞表白程序
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
常州企业网站制作公司,全国继续教育网怎么登录?
Python文件异常处理策略_健壮性说明【指导】
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
香港服务器部署网站为何提示未备案?
php打包exe后无法访问网络共享_共享权限设置方法【教程】
微信小程序 五星评分(包括半颗星评分)实例代码
php结合redis实现高并发下的抢购、秒杀功能的实例
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
免费网站制作appp,免费制作app哪个平台好?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
详解Android——蓝牙技术 带你实现终端间数据传输
潮流网站制作头像软件下载,适合母子的网名有哪些?
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
如何在Windows服务器上快速搭建网站?
Laravel DB事务怎么使用_Laravel数据库事务回滚操作

