用Python寫乙個多執行緒 多程序的TCP伺服器

2021-08-24 23:21:47 字數 2992 閱讀 5182

背景:同學公司的感測器裝置需要將收集的資料發到伺服器上,前期想寫乙個簡單的伺服器來測試下使用效果,裝置收集的資料非常的重要,所以考慮使用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

class

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)

defrun_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()

defservice_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:" + receive_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()

defmain

(port):

"""建立乙個web伺服器"""

wsgi_server = wsgiserver(port)

print("伺服器已開啟")

wsgi_server.run_forever()

if __name__ == '__main__':

port = 8125

# 指定埠

main(8125)

用python寫乙個restful API

coding utf 8 package.module python實現的圖書的乙個restful api.restful api 一般模式 get select 從伺服器取出資源 一項或多項 post create 在伺服器新建乙個資源。put update 在伺服器更新資源 客戶端提供改變後的完...

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模組執行緒,當主線程結束時其子執行緒也會被強制結...