Python Socket编程详细介绍


Posted in Python onMarch 23, 2017

在使用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 相关文章推荐
状态机的概念和在Python下使用状态机的教程
Apr 11 Python
用Python生成器实现微线程编程的教程
Apr 13 Python
简单介绍Python的Django框架加载模版的方式
Jul 20 Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 Python
Python+Turtle动态绘制一棵树实例分享
Jan 16 Python
用python与文件进行交互的方法
Mar 01 Python
浅谈python之新式类
Aug 12 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
重构Python代码的六个实例
Nov 25 Python
Python中对象的比较操作==和is区别详析
Feb 12 Python
python3中int(整型)的使用教程
Mar 23 #Python
python利用Guetzli批量压缩图片
Mar 23 #Python
python3中str(字符串)的使用教程
Mar 23 #Python
python常用知识梳理(必看篇)
Mar 23 #Python
Python爬取qq music中的音乐url及批量下载
Mar 23 #Python
Python爬取网页中的图片(搜狗图片)详解
Mar 23 #Python
Python编程之event对象的用法实例分析
Mar 23 #Python
You might like
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
javascript冒泡排序小结
2016/04/10 Javascript
jQuery搜索框效果实现代码(百度关键词联想)
2021/02/25 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
python3实现ftp服务功能(客户端)
2017/03/24 Python
对Python中的@classmethod用法详解
2018/04/21 Python
python文件拆分与重组实例
2018/12/10 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
Python直接赋值及深浅拷贝原理详解
2020/09/05 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
如何解决python多种版本冲突问题
2020/10/13 Python
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
C#面试题问题集
2016/04/02 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
公司出纳岗位职责
2013/12/07 职场文书
党员个人对照检查材料
2014/10/01 职场文书
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python