最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python創(chuàng)建websocket服務(wù)端并給出不同客戶端的請(qǐng)求

 更新時(shí)間:2023年01月18日 14:49:01   作者:虛壞叔叔  
本文主要介紹了使用Python創(chuàng)建websocket服務(wù)端并給出不同客戶端的請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

使用Python創(chuàng)建websocket服務(wù)端,并給出不同客戶端的請(qǐng)求

一、 WebSocket是啥

WebSocket 和HTTP一樣,也是一種通訊協(xié)議,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)。
在 WebSocket API 中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。

有很多網(wǎng)站為了實(shí)現(xiàn)推送技術(shù),所用的技術(shù)都是 Ajax 輪詢。輪詢是在特定的的時(shí)間間隔(如每1秒),由瀏覽器對(duì)服務(wù)器發(fā)出HTTP請(qǐng)求,然后由服務(wù)器返回最新的數(shù)據(jù)給客戶端的瀏覽器。這種傳統(tǒng)的模式帶來(lái)很明顯的缺點(diǎn),即瀏覽器需要不斷的向服務(wù)器發(fā)出請(qǐng)求,然而HTTP請(qǐng)求可能包含較長(zhǎng)的頭部,其中真正有效的數(shù)據(jù)可能只是很小的一部分,顯然這樣會(huì)浪費(fèi)很多的帶寬等資源。

HTML5 定義的 WebSocket 協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實(shí)時(shí)地進(jìn)行通訊。

二、 WebSocket的C/S架構(gòu)

在服務(wù)端啟動(dòng)接收WebSocket請(qǐng)求的服務(wù),客戶端建立Websocket連接并發(fā)送請(qǐng)求(Message),服務(wù)端接收后,就可以根據(jù)處理邏輯,按需向客戶端發(fā)送消息了,例如發(fā)送主動(dòng)推送。

三、依賴的三方庫(kù)

Python websockets是用于在Python中構(gòu)建WebSocket服務(wù)器和客戶端的庫(kù),它基于asyncio異步IO建立,提供基于協(xié)程的API。
請(qǐng)盡量使用Python≥3.6以上版本來(lái)運(yùn)行websockets。

依賴的三方庫(kù)為: websocket, websocket-client.

pip install websocket  
pip3 install websocket-client
pip3 install websockets

主要用到的API有:

websockets.connect()
websockets.send()
websockets.recv()

四、簡(jiǎn)單例子

server.py,用于構(gòu)建websocket服務(wù)器,在本地8765端口啟動(dòng),會(huì)將接收到的消息加上I got your message:返回回去。

import asyncio
import websockets


async def echo(websocket, path):
    async for message in websocket:
        message = "I got your message: {}".format(message)
        await websocket.send(message)


asyncio.get_event_loop().run_until_complete(websockets.serve(echo, 'localhost', 8765))
asyncio.get_event_loop().run_forever()

client.py和指定url建立websocket連接,并發(fā)送消息,然后等待接收消息,并將消息打印出來(lái)。

import asyncio
import websockets


async def hello(uri):
    async with websockets.connect(uri) as websocket:
        await websocket.send("Hello world!")
        recv_text = await websocket.recv()
        print(recv_text)


asyncio.get_event_loop().run_until_complete(
    hello('ws://localhost:8765'))

先執(zhí)行server.py,再執(zhí)行client.py,client.py的輸出結(jié)果如下:

I got your message: Hello world!

五 主動(dòng)發(fā)消息

建立連接之后,客戶端可以隨時(shí)接收服務(wù)器發(fā)來(lái)的消息。服務(wù)器可以依據(jù)邏輯,給客戶端推送指定消息。
服務(wù)器和客戶端代碼會(huì)有一點(diǎn)變化,在服務(wù)器回完第一條消息之后,開始輪詢時(shí)間,當(dāng)秒數(shù)達(dá)到0的時(shí)候,會(huì)主動(dòng)給客戶端回一條消息。

server.py

import asyncio
import websockets
import time


async def echo(websocket, path):
    async for message in websocket:
        message = "I got your message: {}".format(message)
        await websocket.send(message)

        while True:
            t = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            if str(t).endswith("0"):
                await websocket.send(t)
                break


asyncio.get_event_loop().run_until_complete(
    websockets.serve(echo, 'localhost', 8765))
asyncio.get_event_loop().run_forever()

client.py

import asyncio
import websockets


async def hello(uri):
    async with websockets.connect(uri) as websocket:
        await websocket.send("Hello world!")
        print("< Hello world!")
        while True:
            recv_text = await websocket.recv()
            print("> {}".format(recv_text))


asyncio.get_event_loop().run_until_complete(
    hello('ws://localhost:8765'))

先執(zhí)行server.py,再執(zhí)行client.py,client.py的輸出結(jié)果如下:

< Hello world!
> I got your message: Hello world!
> 2020-05-29 15:11:50

最后一條消息則是服務(wù)端主動(dòng)給客戶端發(fā)送的。

六、在瀏覽器上使用

如何在前端發(fā)送websocket請(qǐng)求呢?
看這段代碼,先建立連接,然后向服務(wù)端發(fā)送Hello world,然后把接收到的所有消息依次展示出來(lái)。

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title>websocket通信客戶端</title>
    <script src="jquery-3.5.0.min.js"></script>
    <script type="text/javascript">
        function WebSocketTest() {
            if ("WebSocket" in window) {
                // 打開一個(gè) web socket
                var ws = new WebSocket("ws://127.0.0.1:8765");
                // 連接建立后的回調(diào)函數(shù)
                ws.onopen = function () {
                    // Web Socket 已連接上,使用 send() 方法發(fā)送數(shù)據(jù)
                    ws.send("Hello world!");
                    $("#main").append("<p>" + "<=" + "Hello world!" + "</p>")
                };

                // 接收到服務(wù)器消息后的回調(diào)函數(shù)
                ws.onmessage = function (evt) {
                    var received_msg = evt.data;
                    if (received_msg.indexOf("sorry") == -1) {
                        $("#main").append("<p>" + "=>" + received_msg + "</p>")
                    }
                };
                // 連接關(guān)閉后的回調(diào)函數(shù)
                ws.onclose = function () {
                    // 關(guān)閉 websocket
                    alert("連接已關(guān)閉...");
                };
            } else {
                // 瀏覽器不支持 WebSocket
                alert("您的瀏覽器不支持 WebSocket!");
            }
        }
    </script>
</head>
<body onload="WebSocketTest()">
<div id="main">
</div>
</body>
</html>

效果大概的這樣的:

可以在一開始的時(shí)候就抓websocket的包:

這里可以清晰的看到每一條消息。

到此這篇關(guān)于使用Python創(chuàng)建websocket服務(wù)端并給出不同客戶端的請(qǐng)求的文章就介紹到這了,更多相關(guān)Python創(chuàng)建websocket服務(wù)端內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入淺析Python中l(wèi)ist的復(fù)制及深拷貝與淺拷貝

    深入淺析Python中l(wèi)ist的復(fù)制及深拷貝與淺拷貝

    這篇文章主要介紹了Python中l(wèi)ist的復(fù)制及深拷貝與淺拷貝及區(qū)別解析 ,需要的朋友可以參考下
    2018-09-09
  • python制作的天氣預(yù)報(bào)小工具(gui界面)

    python制作的天氣預(yù)報(bào)小工具(gui界面)

    大家好??!我用Tkinter寫了一個(gè)天氣預(yù)報(bào)小工具,支持34個(gè)省級(jí)行政區(qū)以及港澳臺(tái)地區(qū)天氣,覆蓋全面。程序打包好放在了藍(lán)奏云,與大家分享一下。
    2021-05-05
  • 基于Python編寫一個(gè)簡(jiǎn)單的垃圾郵件分類器

    基于Python編寫一個(gè)簡(jiǎn)單的垃圾郵件分類器

    隨著電子郵件的廣泛使用,垃圾郵件也日益增多,本篇文章將介紹如何使用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的垃圾郵件分類器,幫助您更好地管理自己的電子郵件,需要的可以參考一下
    2023-04-04
  • python如何把字符串類型list轉(zhuǎn)換成list

    python如何把字符串類型list轉(zhuǎn)換成list

    這篇文章主要介紹了python如何吧字符串類型list轉(zhuǎn)換成list,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python數(shù)據(jù)類型之Dict字典實(shí)例詳解

    Python數(shù)據(jù)類型之Dict字典實(shí)例詳解

    這篇文章主要介紹了Python數(shù)據(jù)類型之Dict字典,結(jié)合具體實(shí)例形式詳細(xì)分析了Python字典的概念、原理、定義、元素添加、刪除、遍歷等相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • Python 實(shí)現(xiàn)數(shù)組相減示例

    Python 實(shí)現(xiàn)數(shù)組相減示例

    今天小編就為大家分享一篇Python 實(shí)現(xiàn)數(shù)組相減示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Pytorch?autograd與邏輯回歸的實(shí)現(xiàn)詳解

    Pytorch?autograd與邏輯回歸的實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了Pytorch?autograd與邏輯回歸的實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Django分頁(yè)器的用法你都了解嗎

    Django分頁(yè)器的用法你都了解嗎

    在我們做Django項(xiàng)目,數(shù)據(jù)量比較大的時(shí)候,我們需要分頁(yè)器來(lái)做分頁(yè)顯示,接下來(lái)重點(diǎn)給大家介紹利用Django開發(fā)MVT模型項(xiàng)目時(shí)分頁(yè)器的使用,感興趣的朋友一起看看吧
    2021-05-05
  • Python3+Appium安裝使用教程

    Python3+Appium安裝使用教程

    這篇文章主要介紹了Python3+Appium安裝使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 撤回我也能看到!教你用Python制作微信防撤回腳本

    撤回我也能看到!教你用Python制作微信防撤回腳本

    如果好友短時(shí)間發(fā)送多條消息然后撤回會(huì)難以判斷究竟撤回的是哪條信息,只能靠猜.后來(lái)我覺(jué)得“猜”這個(gè)事情特別不Pythonic,研究一段時(shí)間后找到了解決方案,不得不驚嘆ItChat真的好強(qiáng)大,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

景泰县| 天峻县| 廉江市| 黄梅县| 舞钢市| 绥江县| 土默特右旗| 桂平市| 塘沽区| 伊春市| 韩城市| 玛多县| 新疆| 焦作市| 大埔区| 望都县| 盘山县| 凤城市| 平乡县| 逊克县| 介休市| 石柱| 临猗县| 博乐市| 六盘水市| 田阳县| 青冈县| 藁城市| 金川县| 临邑县| 垫江县| 孙吴县| 体育| 天峨县| 嘉荫县| 曲松县| 仙桃市| 繁峙县| 桂阳县| 元氏县| 资阳市|