Python Socket编程详细介绍

作者:kongxx 时间:2021-01-02 02:56:21 

在使用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

来源:http://blog.csdn.net/kongxx/article/details/64951241

标签:Python,Socket
0
投稿

猜你喜欢

  • vue 需求 data中的数据之间的调用操作

    2023-07-02 16:52:03
  • CSS 裸奔节

    2009-04-09 19:36:00
  • python 文件操作api(文件操作函数)

    2023-11-19 08:58:38
  • 数据库设计工具MySQL Workbench使用教程(超级详细!)

    2024-01-29 01:26:22
  • 浅谈python类属性的访问、设置和删除方法

    2022-01-12 00:14:48
  • Python后台开发Django会话控制的实现

    2022-11-09 22:29:16
  • 极简主义网站设计:寓丰富于简单

    2009-12-07 21:37:00
  • MySQL数据库性能优化之表结构优化

    2012-05-08 07:10:34
  • 使用python处理题库表格并转化为word形式的实现

    2023-07-25 12:33:18
  • 在Pytorch中使用Mask R-CNN进行实例分割操作

    2023-05-18 21:41:22
  • 图像检索之基于vlfeat实现SIFT特征

    2021-11-18 13:13:40
  • 解读Scrapy回调函数callback传递参数的方式

    2022-12-02 04:12:53
  • python学生管理系统开发

    2022-05-20 23:00:00
  • Go单元测试工具gomonkey的使用

    2024-05-22 10:19:21
  • python的numpy模块实现逻辑回归模型

    2022-10-01 07:05:59
  • Python中pygal绘制雷达图代码分享

    2023-09-27 10:03:59
  • Facebook:产品设计评价体系解密

    2011-05-24 17:13:00
  • MySQL如何保证备份数据的一致性详解

    2024-01-19 17:25:45
  • 详解Django中Request对象的相关用法

    2021-12-08 16:30:06
  • JavaScript 浮动定位提示效果实现代码第1/2页

    2023-07-22 23:26:19
  • asp之家 网络编程 m.aspxhome.com