多執行緒的tcp伺服器,供大家參考,具體內容如下
背景:同學公司的感測器裝置需要將收集的資料發到伺服器上,前期想寫乙個簡單的伺服器來測試下使用效果,裝置收集的資料非常的重要,所以考慮使用tcp協議來實現。
因為只是測試使用,所以採用多執行緒的方式,畢竟節省資源嘛(使用協程時會導致i/o阻塞)
開門見山,直接搬上來了
一、tcp_server_v1.0使用說明:
1.執行環境:python3直譯器,並安裝socket、threading模組;
2.該版本使用多執行緒實現的多工;
3.支援多台裝置同時連線,並同時提供服務。
二、**邏輯:
指定伺服器執行埠為:8125
建立乙個伺服器類
例項化乙個伺服器物件
伺服器物件呼叫類中的方法
1 初始化伺服器屬性(def __init__)
1.1 建立套接字
1.2 解決程式埠占用問題
1.3 繫結本地ip位址
1.4 將套接字變為監聽套接字,最大連線數量為100
2 定義裝置連線方法(def run_forever)
2.1 進入迴圈
2.2 等待裝置連線...
2.2.1 當裝置連線,列印裝置的 ip 和 port
2.2.2 建立執行緒,呼叫業務處理方法,為該裝置提供服務
3 業務處理方法(def service_machine)
3.1 進入迴圈
3.2 等待接收裝置傳送資料...
3.2.1 當伺服器接收到資料
3.2.2 判斷資料是否為空
否:列印資料內容,進行業務處理,將處理後的資料結果返回給裝置
是:列印裝置斷開連線,退出迴圈,關閉套接字
**實現如下:
#!c:\python3.6.5\python.exe
# -*- coding: gbk -*-
import socket
import threading
www.cppcns.comclass wsgiserver(object):
def __init__(self, port):
"""初始化物件"""
# 建立套接字
self.tcp_server_socket = socket.socket(socket.af_inet, socket.sock_stream)
# 解決程式埠占用問題
self.tcp_server_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)
# 繫結本地ip位址
self.tcp_server_socket.bind(("", port))
# 將套接字變為監聽套接字,最大連線數量為100
self.tcp_server_socket.listen(100)
def run_forever(self):
"""裝置連線"""
while true:
# 1.等待裝置連線(通過ip位址和埠建立tcp連線)
# 如果有裝置連線,則會生成用於裝置和伺服器通訊的套接字:new_socket
# 會獲取到裝置的ip位址和埠
new_socket, client_addr = self.tcp_server_socket.accept()
print("裝置已連線".format(client_addr))
# 2.建立執行緒處理裝置的需求
t1 = threading.thread(target=self.service_machine, args=(new_socket, client_addr))
t1.start()
def service_machine(self, new_socket, client_addr):
"""業務處理"""
while true:
# 3.接收裝置傳送的資料,單次最大1024位元組,按『gbk'格式解碼
receive_data = new_socket.recv(1024).decode("gbk")
# 4.如果裝置傳送的資料不為空
if receive_data:
# 4.1 列印接收的資料,這裡可以將裝置傳送的資料寫入到檔案中
# 獲取裝置的id資訊
print(receive_data)
if receive_data[0:6] == "report":
response = "set ok:" + recewww.cppcns.comive_data
else:
receive_data = receive_data[6:].split(",")[0]
# 拼接響應資料
response = "alarm=" + receive_data + ",switch:clear"
print(response)
# 4.2 返回原資料作為應答,按『utf-8'格式編碼
new_socket.send(response.encode("utf-8"))
# 5.當裝置斷開連線時,會收到空的位元組資料,判斷裝置已斷開連線
else:
print('裝置斷開連線...'.format(client_addr))
break
# 關閉套接字
new_socket.close()
def main(port):
"""建立乙個web伺服器"""
wsgi_server = wsgiserver(port)
print("伺服器已開啟")
wsgi_server.run_forever()
if __name__ == '__main__':
port = 8125 # 指定埠
main(8125)
本文標題: python實現多執行緒/多程序的tcp伺服器
本文位址: /jiaoben/python/271822.html
python多執行緒 多程序
background task once join is used whether deamon attribute is true is not importantonly useful when the main program is running ok to kill starmap和map...
python多執行緒 多程序
threading相對與thread是更高階別的執行緒管理模組 thread和threading模組中的一些屬性會有衝突 thread模組擁有的同步原因實際上只有乙個lock,而threading有很多 lock,semaphore等 使用thread模組執行緒,當主線程結束時其子執行緒也會被強制結...
python多執行緒多程序
執行緒等待,多執行緒在執行的時候,每個執行緒都是獨立執行的,不受其他的執行緒干擾,如果想在哪個執行緒執行完之後,再做其他操作的話,就得等待它完成,那怎麼等待呢,使用join,等待執行緒結束 for t in threads 等待3個子執行緒 t.join 主線程等待子執行緒 end time tim...