国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python Socket編程詳細介紹

2019-11-25 16:17:35
字體:
來源:轉載
供稿:網友

在使用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 socketimport pickleimport threadPORT = 12345EOF = '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 picklefrom agent.sockets import *sc = SocketClient('localhost', PORT)request = SocketRequest('abc')response = sc.execute(request)print requestprint response

運行測試

首先,運行 socket_server.py

然后,運行 socket_client.py

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 荆门市| 闽清县| 靖安县| 中牟县| 常山县| 乡宁县| 蚌埠市| 天气| 益阳市| 富平县| 保德县| 肇源县| 含山县| 阳春市| 吉水县| 中卫市| 石嘴山市| 泽普县| 天门市| 全州县| 宁陵县| 宜黄县| 柏乡县| 北碚区| 平利县| 通州市| 贵德县| 威海市| 广平县| 临城县| 安泽县| 颍上县| 浙江省| 大连市| 黄陵县| 华蓥市| 容城县| 邹平县| 贵定县| 海原县| 镇原县|