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
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apache iotdb_Apache-
- 下一篇: python的for循环语句_干货丨Py