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 23 Python
python编写爬虫小程序
May 14 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
Mar 24 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
Python中elasticsearch插入和更新数据的实现方法
Apr 01 Python
python模块smtplib学习
May 22 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 Python
python3使用matplotlib绘制条形图
Mar 25 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
Python创建简单的神经网络实例讲解
Jan 04 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 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中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
通过AngularJS实现图片上传及缩略图展示示例
2017/01/03 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
Python内置函数的用法实例教程
2014/09/08 Python
python获取当前时间对应unix时间戳的方法
2015/05/15 Python
Python3遍历目录树实现方法
2015/05/22 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
python日期与时间戳的各种转换示例
2020/02/12 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
2019年.net常见面试问题
2012/02/12 面试题
自我评价范文点评
2013/12/04 职场文书
应届毕业生自我鉴定范文
2013/12/27 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
公司办公室岗位职责
2014/03/19 职场文书
2014年新生军训方案
2014/05/01 职场文书
Python基础之字符串格式化详解
2021/04/21 Python