Last Updated on 2021-04-13 by Clay
我本來打算直接寫一篇使用 Socket 來建立簡單的、只會重複你說的話的 ChatBot,跟現在網路上還滿多的 LineBot 教學差不多。不過差別在於我使用的是 Socket 來建立兩端的連線,而 LineBot 我看過大部份都是使用 webhook 來完成的。
但後來想想,因為我還要拉出界面啥的,怕這樣敘述起來很亂,最後還是忍痛拆成兩偏了。(其實也沒忍什麼,只是覺得一篇解決比較簡單哈哈哈。)
那麼,這篇我先介紹一下 Socket,以及在 Python 中要怎麼使用吧!
Socket
Socket 最早源自於 Berkeley 大學所開發的,我們可以將其視為可以在網路上通訊的工具,只要使用這個工具、或者你習慣說是 API,我們便可以建立起不同主機的 Server 端以及 Client 端,並且讓彼此互相連接、發送訊息。
在 Python 中,本來就存在著 Socket 的 Package,所以我們並不需要使用指令另外安裝,直接 import 即可。
那麼,以下是一段簡單的 sample code。
Server.py
# -*- coding: utf-8 -*- import socket HOST = '127.0.0.1' PORT = 8000 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((HOST, PORT)) server.listen(10) while True: conn, addr = server.accept() clientMessage = str(conn.recv(1024), encoding='utf-8') print('Client message is:', clientMessage) serverMessage = 'I\'m here!' conn.sendall(serverMessage.encode()) conn.close()
Output:
沒錯,在這邊的話,我們什麼結果都沒有印出來,我們只是啟動了 socker 的 server 端(伺服器) 在等待 client 端(客戶端)的訊息而已。
Client.py
import socket HOST = '127.0.0.1' PORT = 8000 clientMessage = 'Hello!' client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((HOST, PORT)) client.sendall(clientMessage.encode()) serverMessage = str(client.recv(1024), encoding='utf-8') print('Server:', serverMessage) client.close()
Output:
# Server
Client message is: Hello!
# Client
Server: I'm here!
稍微講解下程式碼吧。
一開始,在 Server 端,我們先設定好 Host 跟我們的 Port。在這邊,我們 Host 先設定為 127.0.0.1,也就是本機伺服器的地址。如果你有另外一台有固定 IP 的電腦,也可以在上面啟動伺服器(IP 記得填那台電腦的),再用另外一台電腦用 Client 端連線。
socket.AF_INET: IPv4 (Default)
socket.SOCK_STREAM: TCP (Default)
這裡我們要設定這兩種選項,也是經典的 IPv4 的 TCP/IP 連線。這種連線機制比較可靠,不過傳輸速度不夠快。
除此之外還有個地方值得注意:那便是我們傳送的訊息是 byte 的資料型態,我們需要轉換成 string 顯示出來才是字串,詳細可以看我兩邊的程式碼。
Client 端傳送了一次訊息後便關閉了;相較之下,我讓 Server 端持續開著等待 Client 端的請求。
這篇是比較基本就能完成的互傳訊息,接下來我打算進展一些,可用這個套件來完成比較多的功能。
希望可以增加些解說
很棒
如果有幫上忙的話就好了。
你好,我在網路上有看到pymodbus、python socket、modbus_tk三種都是modbus tcp ip通訊,請問這3種差別在哪?
你好,我並沒有特別鑽研這方面的相關知識。
不過這是個很有意思的問題,我試著詢問了最近火爆的 chatGPT 這個問題。(如果有興趣,也很歡迎去試試看,現在是免費的研究先覽版本!)
它的回答如下:
modbus_tk 是一個 Python 庫,可以用來模擬和測試 Modbus 協定。它提供了一個簡單的方法來模擬 Modbus 用戶端和服務器,並提供了一些有用的工具,如遠程模擬和日誌功能。
Python socket 是一個 Python 標準庫,用於網絡编程。它提供了底層的網絡套接字功能,可以用來實現客戶端和服務器之間的網絡通信。
pymodbus 是一個可以用來操作 Modbus 協定的 Python 庫。它提供了一個易於使用的接口來訪問 Modbus 功能碼,並提供了基礎的客戶端和服務器實現。
這三種庫都是用於實現 Modbus TCP/IP 通信的,但是它們之間有一些差異。modbus_tk 和 pymodbus 都提供了對 Modbus 協定的支持,而 Python socket 提供了網絡编程的基礎功能。modbus_tk 和 pymodbus 都提供了模擬和測試工具,但是 Python socket 主要用於實現客戶端和服務器之間的網絡通信。
好的,謝謝你