MicroPython esp32 socket服務(wù)端

esp 32 上測(cè)試
_thread 最多創(chuàng)建8個(gè)線程 所以要限制客戶端數(shù)量

接收中文的時(shí)候遇到一個(gè)坑
客戶端用SocketTool.exe創(chuàng)建的 發(fā)生過(guò)來(lái)的文本編碼好像不是標(biāo)準(zhǔn)的utf-8導(dǎo)致亂碼
接收中文淘菩,請(qǐng)保證客戶端發(fā)送過(guò)來(lái)的內(nèi)容為utf-8

import _thread
import socket

# 檢測(cè)端口是否使用
def check_port_in_use(port, host='127.0.0.1') -> bool:
    s = None
    try:
        s = socket.socket()
        s.settimeout(1)
        s.connect((host, int(port)))
        print(port, ' has been used')
        return True
    except OSError:
        print(port, ' don\'t use')
        return False
    finally:
        if s:
            s.close()

# Socket服務(wù)端
class SocketServer(object):

    def __init__(self, ip, port, parse_def) -> None:
        """
        * ip 服務(wù)ip
        * port 服務(wù)端口
        * parse_def 解析接受到的數(shù)據(jù)函數(shù)
        * client_max 最大客戶端數(shù)量
        * client_list 客戶端列表
        * is_run 是否正在運(yùn)行
        * server_socket 服務(wù)端socket
        """
        self.ip = ip
        self.port = port
        self.parse_def = parse_def
        self.client_max = 3
        self.client_list = []
        self.is_run = False
        self.server_socket = None
        pass

    # 啟動(dòng)服務(wù)

    def start(self):
        if not self.is_run:
            _thread.start_new_thread(self.do_create_server, (socket.socket(),))
            print(self, 'start server win!')
        else:
            print(self, 'start server lose!')

    # 停止服務(wù)

    def stop(self):
        print(self, 'stop server ... start!')
        if self.client_list:
            for item in self.client_list:
                print(item)
                try:
                    item[0].close()
                    print(item[1], 'client close win!')
                except OSError:
                    print(item[1], 'client close lose!')
        else:
            print('client list is null')
        if self.server_socket:
            try:
                self.server_socket.close()
                print(self.server_socket, 'server close win!')
            except OSError:
                print(self.server_socket, 'server close lose!')
        self.is_run = False
        print(self, 'stop server ... end!')

    def do_create_server(self, s):
        self.is_run = True
        if not check_port_in_use(self.port):
            print('server ip:', self.ip, ' port:', self.port)
            self.server_socket = s
            self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.server_socket.bind((self.ip, self.port))
            self.server_socket.listen(0)
            self.server_socket.settimeout(1.0)
            while self.is_run:
                try:
                    conn, address = self.server_socket.accept()
                except OSError:
                    continue
                if len(self.client_list) < self.client_max:
                    _thread.start_new_thread(self.do_client_read, (conn, address))
                    print('client list add ', address)
                else:
                    print('client size > ', self.client_max)
                    try:
                        conn.close()
                    except OSError:
                        pass
        self.is_run = False

    def do_client_read(self, conn, address):
        self.client_list.append((conn, address))
        print('start read ', address)
        while self.is_run:
            try:
                data = conn.recv(4096)
                if len(data) == 0:
                    break
                data = str(data, 'utf-8')
                print(address, 'read data str = ', data)
                self.parse_def(data)
            except BaseException:
                pass
        self.client_list.remove((conn, address))
        print('client close from:', address)
        conn.close()

食用方法

print('start server')
sss = SocketServer('192.168.50.17',60000,do_parse_data)
sss.start()
time.sleep(20)
sss.stop()


time.sleep(10)
sss.start()
print('end server')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逻淌,一起剝皮案震驚了整個(gè)濱河市总珠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怨咪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呛谜,死亡現(xiàn)場(chǎng)離奇詭異溶诞,居然都是意外死亡凌箕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門词渤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牵舱,“玉大人,你說(shuō)我怎么就攤上這事缺虐∥弑冢” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵高氮,是天一觀的道長(zhǎng)慧妄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)剪芍,這世上最難降的妖魔是什么塞淹? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮罪裹,結(jié)果婚禮上饱普,老公的妹妹穿的比我還像新娘。我一直安慰自己状共,他們只是感情好套耕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著口芍,像睡著了一般箍铲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鬓椭,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天颠猴,我揣著相機(jī)與錄音,去河邊找鬼小染。 笑死翘瓮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裤翩。 我是一名探鬼主播资盅,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼踊赠!你這毒婦竟也來(lái)了呵扛?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤筐带,失蹤者是張志新(化名)和其女友劉穎今穿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伦籍,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蓝晒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年腮出,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芝薇。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胚嘲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馋劈,到底是詐尸還是另有隱情,我是刑警寧澤灭红,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布侣滩,位于F島的核電站,受9級(jí)特大地震影響变擒,放射性物質(zhì)發(fā)生泄漏君珠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一娇斑、第九天 我趴在偏房一處隱蔽的房頂上張望策添。 院中可真熱鬧,春花似錦毫缆、人聲如沸唯竹。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浸颓。三九已至,卻和暖如春旺拉,著一層夾襖步出監(jiān)牢的瞬間产上,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工蛾狗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晋涣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓沉桌,卻偏偏與公主長(zhǎng)得像谢鹊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子留凭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容