一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python Socket編程詳細介紹

Python Socket編程詳細介紹

2020-09-25 10:11kongxx Python

這篇文章主要介紹了Python Socket編程詳細介紹,socket可以建立連接,傳遞數據,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

在使用Python做socket編程時,由于需要使用阻塞(默認)的方式來讀取數據流,此時對于數據的結束每次都需要自己處理,太麻煩。并且網上也沒找到太好的封裝,所以就自己寫了個簡單的封裝。

封裝思路

1. 客戶端每次請求均發送一個 SocketRequest 對象,其中封裝具體的數據,這里使用json。對于要發送的數據,會自動添加一個結束符標識(EOF = ‘0x00')。

2. 服務器端接收數據時,根據結束符標識來生成完整的數據,并解包成 SocketRequest 對象。

3. 服務器端根據 SocketRequest 的內容,來生成 SocketResponse 對象,這里使用了一個 SimpleRequestHandler 類來處理,例子中就是沒有做任何處理,然后原樣返回。

4. 服務器端發送 SocketResponse 給客戶端。其中也需要對包做一個封裝,會自動添加一個結束符標識(EOF = ‘0x00')。

5. 客戶接收數據時,根據結束符標識來生成完整的數據,并解包成 SocketResponse 對象,然后返回。

封裝類

sockets.py

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/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

?
1
2
3
4
5
6
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from agent.sockets import *
 
ss = SocketServer(PORT)
ss.startup()

socket_client.py

?
1
2
3
4
5
6
7
8
9
10
11
#!/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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 十六一下岁女子毛片免费 | 亚洲 日韩经典 中文字幕 | 色操网 | 青青操在线| 青青草国产精品久久碰 | 九草视频在线 | 精品亚洲欧美中文字幕在线看 | 日本高清va不卡视频在线观看 | 亚洲国产果果在线播放在线 | 四虎影视4hutv最新地址在线 | 午夜一区二区三区 | 师尊被各种play打屁股 | 国产精品色拉拉免费看 | 四虎免费影院在线播放 | 婚前试爱免费观看 | 午夜特级毛片 | 奇米影视4444 | 国产一区二区三区久久小说 | 亚洲欧美另类第一页 | 好大好想要| 7777色鬼xxxx欧美色夫 | 天天舔天天干天天操 | 114级毛片免费观看 1024亚洲天堂 | 精品无码国产AV一区二区三区 | 国产香蕉一区二区精品视频 | 18videossex性欧美69 | 日韩中文字幕在线不卡 | 福利入口在线观看 | yy3341殇情影院理论片 | 美女和男生搞基 | 黄动漫车车好快的车车双女主 | aaa毛片视频免费观看 | 天堂成人在线视频 | 亚洲春色综合另类网蜜桃 | boobsmilking流奶水| 亚洲精品国产成人 | 好爽好深好猛好舒服视频上 | 欧美高清乌克兰精品另类 | 农夫色综合| 狠狠撸在线播放 | 日本xxxxxx片免费播放18 |