首頁 > 軟體

python利用socket實現使用者端和伺服器端之間進行通訊

2022-05-18 10:00:30

前言:

今天教大家通過Python進行Socket網路程式設計(做一個聊天程式),可以實現在不同的主機(電腦)之間進行通話。

具體效果如何,接著往下看:

可以看到使用者端(上方)向伺服器端(下方)傳送了內容,伺服器端進行了回覆

【備註:使用者端是我的本機,伺服器是另一條主機(阿里雲伺服器)】

兩臺主機的目的:驗證兩臺主機可以相互通訊 

一、socket

先簡單給大家介紹一下什麼是socket,socket(簡稱 通訊端) 是程序間通訊的一種方式,它與其他程序間通訊的一個主要不同是:它能實現不同主機間的程序間通訊。

我們網路上各種各樣的服務大多都是基於 Socket 來完成通訊的,例如瀏覽網頁、QQ 聊天、收發 email 等等

簡單的說:socket可以實現不同主機間進行通訊

socket通訊的條件:IP和埠

ip相信大家都陌生了,每一臺主機都有一個ip,不同主機之間通訊的首要前提就是ip可以互訪,此外還有一個條件就是埠,比如我們經常聽到的80埠,3306埠,8080埠等。

主機中的資料是通過埠傳送和接收,需要將對應埠開啟才能進行通訊。

形象比喻

ip相當於家庭地址,埠相當於門或者窗戶

例子:

(主機A)快遞員要想將快遞(資料)送到你手中(另一臺主機B),需要知道你家的地址(主機B的ip),到你家門口後,需要你開啟門(主機B的埠)才能拿到快遞(資料)。

這裡需要分伺服器端和使用者端,使用者端傳送(主機A),伺服器接收(主機B),當然了,每一臺主機可以充當兩個角色(既是使用者端,也是伺服器),這樣就可以實現兩臺主機之間相互傳送和接收。

看到這裡之後,相信大家都清楚socket在實現不同主機之間通訊的大概意思了,下面開始Python程式碼實現。

二、使用者端實現過程

先來分析使用者端(主機A)的實現過程:

from socket import *
# 1.建立通訊端
tcp_socket = socket(AF_INET,SOCK_STREAM)
# 2.準備連線伺服器,建立連線
serve_ip = "伺服器端(主機B)的IP"
serve_port = 8000  #埠,比如8000
tcp_socket.connect((serve_ip,serve_port))  # 連線伺服器,建立連線,引數是元組形式

首先與伺服器接收端(主機B)建立連線,連線條件(主機B的ip和埠),這裡的埠8000是指將資料傳送到主機B的埠(主機B到時候會監聽8000埠,然後進行接收資料)

#準備需要傳送的資料
send_data = "今天是2021年08月29日,辰哥給伺服器端傳送資料了"
tcp_socket.send(send_data.encode("gbk"))
#從伺服器接收資料
#注意這個1024byte,大小根據需求自己設定
from_server_msg = tcp_socket.recv(1024)
#加上.decode("gbk")可以解決亂碼
print(from_server_msg.decode("gbk"))
#關閉連線
tcp_socket.close()

send_data是往伺服器端(主機B)傳送的內容,from_server_msg是伺服器端(主機B)往使用者端(主機A)傳送的內容

使用者端的程式碼就結束了

三、伺服器實現過程

分析伺服器端(主機B)的實現過程:

from socket import  *
#建立通訊端
tcp_server = socket(AF_INET,SOCK_STREAM)
#繫結ip,port
#這裡ip預設本機
address = ('',8000)
tcp_server.bind(address)
# 啟動被動連線
#多少個使用者端可以連線
tcp_server.listen(128)
#使用socket建立的通訊端預設的屬性是主動的
#使用listen將其變為被動的,這樣就可以接收別人的連結了

伺服器端(主機B)ip可以留空(預設本機),埠8000(因為使用者端往8000埠傳送資料,所以伺服器需要監聽的埠也是8000,與使用者端的埠一致)

# 建立接收
# 如果有新的使用者端來連結伺服器,那麼就產生一個新的通訊端專門為這個使用者端服務
client_socket, clientAddr = tcp_server.accept()
client_socket用來為這個使用者端服務,相當於的tcp_server通訊端的代理
tcp_server_socket就可以省下來專門等待其他新使用者端的連結
這裡clientAddr存放的就是連線伺服器的使用者端地址
#接收對方傳送過來的資料
from_client_msg = client_socket.recv(1024)#接收1024給位元組,這裡recv接收的不再是元組,區別UDP
print("接收的資料:",from_client_msg.encode("gbk"))
#傳送資料給使用者端
send_data = client_socket.send("使用者端你好,伺服器端收到,公眾號【Python研究者】".encode("gbk"))
#關閉通訊端
#關閉為這個使用者端服務的通訊端,就意味著為不能再為這個使用者端服務了
#如果還需要服務,只能再次重新連
client_socket.close()

from_client_msgs 是伺服器端(主機B)接收到來自使用者端(主機A)傳送過來的資料send_data 是伺服器端(主機B)往使用者端(主機A)傳送過去的資料

伺服器端的程式碼就結束了

提醒:伺服器端的8000埠需要開啟,不然無法進行通訊

四、演示

先啟動(執行)伺服器端(主機B)的程式,再執行使用者端(主機A)

可以看到使用者端(上方)向伺服器端(下方)傳送了內容,伺服器端進行了回覆

傳送和響應內容:

使用者端傳送:今天是2021年08月29日,辰哥給伺服器端傳送資料了

伺服器端接收並回復給使用者端:使用者端你好,伺服器端收到,公眾號【Python研究者】

五、實現持續通訊過程

上方動圖演示的是使用者端和伺服器端的一次通訊過程,可以將使用者端的傳送和伺服器端的接收放到迴圈中,實現持續通訊過程。

使用者端:

while(1):
    send_data = input("請輸入內容:")
    #send_data = "今天是2021年08月29日,辰哥給伺服器端傳送資料了"
    tcp_socket.send(send_data.encode("gbk"))
    if send_data == "exit":
         break;
    #從伺服器接收資料
    #注意這個1024byte,大小根據需求自己設定
    from_server_msg = tcp_socket.recv(1024)
    #加上.decode("gbk")可以解決亂碼
    print(from_server_msg.decode("gbk"))
#關閉連線
tcp_socket.close()

伺服器端:

while(1):
    #接收對方傳送過來的資料
    from_client_msg = client_socket.recv(1024)#接收1024給位元組,這裡recv接收的不再是元組,區別UDP
    if(from_client_msg=="exit"):
        break
    print("接收的資料:",from_client_msg.decode("gbk"))
    now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    #傳送資料給使用者端
    send_data = client_socket.send((str(now_time)+" 伺服器端:使用者端你好,伺服器端收到,公眾號【Python研究者】").encode("gbk"))
    #關閉通訊端
    #關閉為這個使用者端服務的通訊端,就意味著為不能再為這個使用者端服務了
    #如果還需要服務,只能再次重新連
client_socket.close()

使用者端可以持續給伺服器端傳送資料,伺服器接收資料後列印並返回資料給使用者端

伺服器端返回的內容:

當前系統時間+伺服器端:使用者端你好,伺服器端收到

最後當用戶端輸入:exit,則斷開與伺服器端的連線:

到此這篇關於python利用socket實現使用者端和伺服器端之間進行通訊 的文章就介紹到這了,更多相關python主機通訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com