日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

erlang 怎么获得socket中的属性_技术干货,python中的异步网络框架socketserver

發布時間:2025/3/20 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 erlang 怎么获得socket中的属性_技术干货,python中的异步网络框架socketserver 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

SocketServer是python基礎庫中提供的高級應用庫, 主要用來編寫異步服務程序. 最近工作原因需要寫虛擬的外圍服務程序, 正好了解到了這個, 所以寫篇文章記錄一下使用心得

在python3中SocketServer模塊被改名為了socketserver模塊

一個小例子

從一個小例子開始講起, 一個小型回顯服務器

server.py

#_*_ coding: utf-8 _*_import SocketServerclass FooHandler(SocketServer.BaseRequestHandler): def handle(self): # 'self.request'為客戶端socket, 可以調用recv, send方法接收或發送數據 data = self.request.recv(30).strip() print('From (%s:%s) msg:%s' % (self.client_address[0], self.client_address[1], data))if __name__ == '__main__': server = SocketServer.TCPServer(('127.0.0.1', 8000), FooHandler) server.serve_forever()

運行python server.py后輸出如下

輸出結果

可以看到我們只使用了不到20行的代碼便實現了一個小型的異步服務器

需要注意這個程序客戶端發起一次數據后客戶會話就會關閉

在實際實驗中, 可能我們在啟動服務程序的時候經常會發生以下異常, 大多數原因是因為服務程序結束后, listen_socket進入TIME_WAIT狀態, 導致第二次啟動的時候會提示端口已經被占用了

Traceback (most recent call last): File "server.py", line 12, in server = SocketServer.ThreadingTCPServer(('127.0.0.1', 8000), FooHandler) File "/usr/lib/python2.7/SocketServer.py", line 417, in __init__ self.server_bind() File "/usr/lib/python2.7/SocketServer.py", line 431, in server_bind self.socket.bind(self.server_address) File "/usr/lib/python2.7/socket.py", line 228, in meth return getattr(self._sock,name)(*args)socket.error: [Errno 98] Address already in use

了解了異常產生的原因后, 其實就可以找到對應的解決方法了. 將服務listen_socket的SO_REUSEADDR屬性打開即可, 由于SocketServer并沒有直接將listen_socket暴露出來, 所以可能不方便直接操作listen_socket, 但是官方提供了一種方法, 就是寫一個繼承SocketServer.TCPServer的子類, 然后將子類的allow_reuse_address設置為True

修改一下我們的程序server.py, 代碼如下

#_*_ coding: utf-8 _*_import SocketServerclass FooHandler(SocketServer.BaseRequestHandler): def handle(self): # 'self.request'為客戶端socket, 可以調用recv, send方法接收或發送數據 data = self.request.recv(30).strip() print('From (%s:%s) msg:%s' % (self.client_address[0], self.client_address[1], data))class SimpleServer(SocketServer.TCPServer): # 開啟監聽套接字的SO_REUSEADDR屬性, 此屬性在'SocketServer.TCPServer'中是默認關閉的 allow_reuse_address = Trueif __name__ == '__main__': server = SimpleServer(('127.0.0.1', 8000), FooHandler) server.serve_forever()

SocketServer.BaseRequestHandler一共有三個方法可以override

  • setup 處理前回調, 用于給連接socket設置一些必要的屬性, 比如socket.setblocking(0)
  • handle 處理時回調, 定義服務器與客戶端交互的邏輯
  • finish 處理后回調, 用于定義關閉連接后的清理操作
  • ThreadingTCPServer

    之前例子中編寫的服務器程序只能用于同時處理一個連接, 當使用多個客戶一起連接時會發現后續的客戶端會被阻塞住, 如果想要處理多個客戶請求時, 需要使用到SocketServer.ThreadingTCPServer

    thread_server.py

    import SocketServerclass FooHandler(SocketServer.BaseRequestHandler): def handle(self): # 'self.request'為客戶端socket, 可以調用recv, send方法接收或發送數據 data = self.request.recv(30).strip() print('From (%s:%s) msg:%s' % (self.client_address[0], self.client_address[1], data))if __name__ == '__main__': server = ThreadingTCPServer(('127.0.0.1', 8000), FooHandler) server.serve_forever()

    如果喜歡我的文章點贊關注下哦!

    總結

    以上是生活随笔為你收集整理的erlang 怎么获得socket中的属性_技术干货,python中的异步网络框架socketserver的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。