物聯網開發硬體應用

提升國內高職學生物聯網開發硬體應用入門技術 待進入科技大學再升級為物聯網開發硬體設計人員


您沒有登錄。 請登錄註冊

網絡 - TCP套接字

向下  內容 [第1頁(共1頁)]

1 網絡 - TCP套接字 于 周一 10月 01, 2018 11:40 am

Admin


Admin
5.網絡 - TCP套接字
大多數互聯網的構建塊是TCP套接字。這些套接字在連接的網絡設備之間提供可靠的字節流。本教程的這一部分將介紹如何在幾種不同的情況下使用TCP套接字。

5.1。星球大戰Asciimation
最簡單的方法是從互聯網上下載數據。在這種情況下,我們將使用blinkenlights.nl網站提供的星球大戰Asciimation服務。它使用端口23上的telnet協議將數據流式傳輸給任何連接的人。它使用起來非常簡單,因為它不需要您進行身份驗證(提供用戶名或密碼),您可以立即開始下載數據。

首先要確保我們有可用的套接字模塊:

>>> 導入 套接字
然後獲取服務器的IP地址:

>>> addr_info = socket 。getaddrinfo (“towel.blinkenlights.nl” , 23 )
該getaddrinfo函數實際返回一個地址列表,每個地址都有超出我們需要的信息。我們想獲得第一個有效地址,然後只獲取服務器的IP地址和端口。為此,請使用:

>>> addr = addr_info [ 0 ] [ - 1 ]
如果您輸入addr_info並addr在提示符下,您將確切地看到他們持有的信息。

使用IP地址,我們可以創建一個套接字並連接到服務器:

>>> s = socket 。socket ()
>>> s 。連接(地址)
現在我們已經連接,我們可以下載並顯示數據:

>>> while True :
... data = s 。recv (500 )
... print (str (data , 'utf8' ), end = '' )
...
當這個循環執行時,它應該開始顯示動畫(使用ctrl-C來中斷它)。

如果你想在那裡嘗試,你也應該能夠使用普通的Python在你的PC上運行相同的代碼。

5.2。HTTP GET請求
下一個示例顯示瞭如何下載網頁。HTTP使用端口80,您首先需要發送“GET”請求才能下載任何內容。作為請求的一部分,您需要指定要檢索的頁面。

讓我們定義一個可以下載和打印URL的函數:

def http_get (url ):
_ , _ , host , path = url 。split ('/' , 3 )
addr = socket 。getaddrinfo (host , 80 )[ 0 ] [ - 1 ]
s = socket 。插座()
小號。connect (addr )
s 。發送(字節('GET /%s HTTP / 1.0 \ r \ n 主機:%s \ r \ n \ r \ n ' % (路徑, 主機), 'utf8' )),
而 True :
data = s 。recv (100 )
if data :
print (str (data , 'utf8' ), end = '' )
else :
break
s 。關閉()
在運行此功能之前,請確保導入套接字模塊。然後你可以嘗試:

>>> http_get ('http://micropython.org/ks/test.html' )
這應該檢索網頁並將HTML打印到控制台。

5.3。簡單的HTTP服務器
以下代碼創建一個簡單的HTTP服務器,該服務器為單個網頁提供一個包含所有GPIO引腳狀態的表:

進口 機
針 = [ 機器。銷(我, 機器。銷。IN ) 用於 我 在 (0 , 2 , 4 , 5 , 12 , 13 , 14 , 15 )]

html = “”“<!DOCTYPE html>
<html>
<head> <title> ESP8266 Pins </ title> </ head>
<body> <h1> ESP8266 Pins </ h1>
<table border =”1“> < tr> <th> Pin </ th> <th> Value </ th> </ tr> %s </ table>
</ body>
</ html>
“”“

import socket
addr = socket 。getaddrinfo ('0.0.0.0' , 80 )[ 0 ] [ - 1 ]

s = 套接字。插座()
小號。bind (addr )
s 。聽(1 )

print ('listen on' , addr )

而 真:
cl , addr = s 。accept ()
print ('client connected from' , addr )
cl_file = cl 。makefile ('rwb' , 0 )
而 True :
line = cl_file 。readline ()
如果 不是 行 或 行 == b ' \ r \ n ' :
break
rows = [ '<tr> <td> %s</ TD> <TD> %d </ TD> </ TR>' % ( STR (p ),p 。值())為p 在銷] 響應= HTML %' \ n ' 。join (rows )cl 。發送(響應)cl 。關閉()

檢視會員個人資料 http://iotboard.666forum.com

回頂端  內容 [第1頁(共1頁)]

這個論壇的權限:
無法 在這個版面回復文章