用socket庫製作一個網內聯機通訊系統,加深你對物聯網應用裏的消息傳遞的理解。
我用的是python3.6.2 自帶 socket庫 導入時直接from socket import * 就可以使用。
socket是一個常用的客戶端將字符串轉成字節傳輸,服務器端收到後,將字節轉成字符串接收的二進制通訊協議.
用socket寫出來的程序有點類似與一個簡易的聊天軟件,我們可以通過該程序跟同一個局域網內的另外一臺機子的使用者聊天。我並沒有深入研究裏面的機制,目前只能實現你一句我一句地聊,還不能完全實現全雙工的通訊。
我把自己的筆記本當客戶端,把樹莓派當服務器端:
客戶端代碼裏要設置對方局域網內的IP,通訊用的端口建議大於10000,緩衝大小1024-10240都可以
## main.c
## test3
##
## Created by 黃日超 on 2018/5/6.
## Copyright © 2018年 黃日超 . All rights reserved.
##
from socket import *
host = '192.168.0.155' # 這是對方的ip
port = 13141 #接口選擇大於10000的,避免衝突
bufsize = 1024 #定義緩衝大小
addr = (host,port) # 元祖形式
udpClient = socket(AF_INET,SOCK_DGRAM) #創建客戶端
while True:
data = input('發送消息給對方:')
data = data.encode(encoding="utf-8")
udpClient.sendto(data,addr) # 發送數據
data,addr = udpClient.recvfrom(bufsize) #接收數據和返回地址
data=data.decode(encoding="utf-8")
print('收到對方的消息',data)
udpClient.close()
代碼裏的host就是接收端的IP,這個怎麼查呢,我的接收端是樹莓派,我把筆記本和樹莓派都連到我的手機熱點上。
然後通過手機熱點管理查看樹莓派的ip,當然,代碼裏的hostIP是我把樹莓派連到實驗室無線網後的ip,跟下圖的IP不一樣。
服務器端不必設置IP,但port端口一定要和發送端一模一樣,緩衝大小最好一樣
#!/usr/bin/env python
from socket import *
#from time import ctime
host = '' #監聽所有的ip
port = 13141 #接口必須一致
bufsize = 1024
addr = (host,port)
udpServer = socket(AF_INET,SOCK_DGRAM)
udpServer.bind(addr) #開始監聽
print('------開始聊天------')
while True:
data,addr = udpServer.recvfrom(bufsize) #接收數據和返回地址
#處理數據
data = data.decode(encoding='utf-8').upper()
print('收到對方的消息:'+data)
data =input('發送消息給對方:')
udpServer.sendto(data.encode(encoding='utf-8'),addr)
#發送數據
udpServer.close()
把運行二者的機子連在同一個無線網內,測試效果如下:
筆記本顯示屏截圖
樹莓派顯示屏截圖
快點動手嘗試下吧!