1. 程式人生 > 其它 >python網路程式設計 socketserver模組

python網路程式設計 socketserver模組

4、socketserver模組

  • socketserver中包含了兩種類,一種為服務類(server class),一種為請求處理類(request handle class)。前者提供了許多方法:像繫結,監聽,執行…… (也就是建立連線的過程)後者則專注於如何處理使用者所傳送的資料(也就是事務邏輯)。
  • socketserver是標準庫中的一個高階模組(Python2.x中名為SocketServer)。
    • socketserver的目標是簡化建立網路客戶端和伺服器的程式碼。(隱藏了實現細節)
    • socketserver是使用類來編寫應用程式。
      • 以面向物件的方式處理事務有助於組織資料,以及邏輯性地將功能放在正確的地方。應用程式現在是事件驅動的,這意味著只有在系統中的事件發生時,它們才會工作。
  • socketserver模組是一個以socket為基礎而建立的高階套接字通訊模組,它支援客戶端請求的執行緒和多程序處理。
  • 在原始伺服器迴圈中,我們阻塞等待請求,當接收到請求時就對其提供服務,然後繼續等待。
  • 在socketserver的伺服器迴圈中,並非在伺服器中建立程式碼,而是定義一個處理程式,這樣當伺服器接收到一個傳入的請求時,伺服器就可以呼叫你的函式。
  • socketserver模組類
  • 用socketserver建立一個服務的步驟:
    • 1、建立一個request handler class(請求處理類),合理選擇StreamRequestHandler和DatagramRequestHandler之中的一個作為父類(當然,使用BaseRequestHandler作為父類也可),並重寫它的handle()方法。
    • 2、例項化一個server class物件,並將服務的地址和之前建立的request handler class傳遞給它。
    • 3、呼叫server class物件的handle_request() 或 serve_forever()方法來開始處理請求。
  • socketserver請求處理程式的預設行為是接受連線、獲取請求,然後關閉連線。由於這個原因,我們不能在應用程式整個執行過程中都保持連線,因此每次向伺服器傳送訊息時,都需要建立一個新的套接字。

1、python3建立TCP伺服器和客戶端

  • 事件包括訊息的傳送和接收。事實上,類定義只包括一個用來接收客戶端訊息的事件處理程式。所有其他的功能都來自使用的SocketServer類。
  • 最後一行程式碼通常是一個伺服器的無限迴圈,它等待並響應客戶端的服務請求。

1、建立SocketServer TCP伺服器

###python3.8
#!/usr/bin/env python
from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH)
from time import ctime

HOST = ''
PORT = 21567
ADDR = (HOST, PORT)

class MyRequesHandler(SRH):
    def handle(self):
        self.data = str(self.request.recv(1024).strip(),'utf8')
        print('...connected from:',self.client_address)
        print(self.data)
        self.request.sendall(bytes('%s %s' % (self.data,ctime()),'utf8'))

tcpServ = TCP(ADDR, MyRequesHandler)
print('waiting for connection...')
tcpServ.serve_forever()

2、建立SocketServer TCP客戶端

###python3.8
# !/usr/bin/env python
from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

while True:
    tcpClisock = socket(AF_INET, SOCK_STREAM)
    tcpClisock.connect(ADDR)
    data = input('> ')
    if not data:
        break
    tcpClisock.send(bytes(data,'utf8'))
    data = tcpClisock.recv(BUFSIZ)
    if not data:
        break
    print(str(data.strip(),'utf8'))
    tcpClisock.close()

2、python2建立TCP伺服器和客戶端

1、建立SocketServer TCP伺服器

###python2.7
#!/usr/bin/env python
from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH)
from time import ctime

HOST = ''
PORT = 21567
ADDR = (HOST, PORT)

class MyRequesHandler(SRH):
    def handle(self):
        print '...connected from:',self.client_address
        self.wfile.write('[%s] %s' % (ctime(), self.rfile.readline()))

tcpServ = TCP(ADDR, MyRequesHandler)
print 'waiting for connection...'
tcpServ.serve_forever()

2、建立SocketServer TCP客戶端

###python2.7
# !/usr/bin/env python
from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

while True:
    tcpClisock = socket(AF_INET, SOCK_STREAM)
    tcpClisock.connect(ADDR)
    data = raw_input('> ')
    if not data:
        break
    tcpClisock.send('%s\r\n' % data)
    data = tcpClisock.recv(BUFSIZ)
    if not data:
        break
    print data.strip()
    tcpClisock.close()