python利用socket實現客戶端和服務端之間進行通信
前言:
今天教大傢通過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主機通信內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python socket如何實現服務端和客戶端數據傳輸(TCP)
- python socket多線程實現客戶端與服務器連接
- python 實現客戶端與服務端的通信
- Python中的socket網絡模塊介紹
- python使用socket高效傳輸視頻數據幀(連續發送圖片)