Skip to content

[Python] 使用 socket 模組基本教學

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 端的請求。

這篇是比較基本就能完成的互傳訊息,接下來我打算進展一些,可用這個套件來完成比較多的功能。


References


Read More

Tags:

6 thoughts on “[Python] 使用 socket 模組基本教學”

  1. 你好,我在網路上有看到pymodbus、python socket、modbus_tk三種都是modbus tcp ip通訊,請問這3種差別在哪?

    1. 你好,我並沒有特別鑽研這方面的相關知識。
      不過這是個很有意思的問題,我試著詢問了最近火爆的 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 主要用於實現客戶端和服務器之間的網絡通信。

Leave a Reply