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数据库事务回滚操作