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如何使用Vite进行前端资源打包?(配置示例)  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  使用spring连接及操作mongodb3.0实例  如何用IIS7快速搭建并优化网站站点?  高端云建站费用究竟需要多少预算?  微信小程序 input输入框控件详解及实例(多种示例)  做企业网站制作流程,企业网站制作基本流程有哪些?  百度浏览器如何管理插件 百度浏览器插件管理方法  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  LinuxCD持续部署教程_自动发布与回滚机制  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  网站建设整体流程解析,建站其实很容易!  jQuery validate插件功能与用法详解  如何在宝塔面板创建新站点?  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  如何用好域名打造高点击率的自主建站?  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  EditPlus中的正则表达式 实战(4)  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何在云主机上快速搭建多站点网站?  Linux安全能力提升路径_长期防护思维说明【指导】  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Laravel如何处理异常和错误?(Handler示例)  Laravel如何优化应用性能?(缓存和优化命令)  lovemo网页版地址 lovemo官网手机登录  java ZXing生成二维码及条码实例分享  Laravel如何发送系统通知?(Notification渠道示例)  Linux系统命令中tree命令详解  js实现获取鼠标当前的位置  Laravel如何自定义错误页面(404, 500)?(代码示例)  C++时间戳转换成日期时间的步骤和示例代码  如何在Windows服务器上快速搭建网站?  如何用已有域名快速搭建网站?  如何快速打造个性化非模板自助建站?  制作旅游网站html,怎样注册旅游网站?  黑客如何通过漏洞一步步攻陷网站服务器?  如何在Windows 2008云服务器安全搭建网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  如何在香港免费服务器上快速搭建网站?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  简历在线制作网站免费版,如何创建个人简历?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  如何有效防御Web建站篡改攻击?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】