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

首頁 > 編程 > Python > 正文

Python Socket編程詳細介紹

2020-02-23 04:28:00
字體:
來源:轉載
供稿:網友

在使用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)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 云阳县| 宾川县| 济宁市| 孟津县| 沙田区| 湖北省| 桐乡市| 夹江县| 乐亭县| 兰坪| 无锡市| 洛川县| 侯马市| 河南省| 桐梓县| 山阳县| 盐山县| 新竹县| 淮阳县| 齐齐哈尔市| 民乐县| 桂林市| 靖江市| 德保县| 尼木县| 安泽县| 调兵山市| 沙湾县| 建德市| 庆云县| 壤塘县| 灌阳县| 周口市| 临清市| 通道| 四会市| 徐水县| 泌阳县| 临高县| 聂荣县| 凤庆县|