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发送伪造的arp请求
Jan 09 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
Django Rest framework之认证的实现代码
Dec 17 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
Python深拷贝与浅拷贝用法实例分析
May 05 Python
python实现本地批量ping多个IP的方法示例
Aug 07 Python
python类共享变量操作
Sep 03 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
Apr 14 Python
Python first-order-model实现让照片动起来
Jun 25 Python
Python实现聚类K-means算法详解
Jul 15 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
php计算函数执行时间的方法
2015/03/20 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
js截取小数点后几位的写法
2013/11/14 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
jQuery手风琴的简单制作
2017/05/12 jQuery
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
2018/01/23 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
jquery实现有过渡效果的tab切换
2020/07/17 jQuery
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
python调用cmd复制文件代码分享
2013/12/27 Python
python中的闭包函数
2018/02/09 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
对pandas的算术运算和数据对齐实例详解
2018/12/22 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
《长征》教学反思
2014/04/27 职场文书
银行授权委托书范本
2014/10/04 职场文书
成都人事代理协议书
2014/10/25 职场文书
还款承诺书范本
2015/01/20 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
同意离婚答辩状
2015/05/22 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库