python利用socket實現(xiàn)客戶端和服務(wù)端之間進行通信_第1頁
python利用socket實現(xiàn)客戶端和服務(wù)端之間進行通信_第2頁
python利用socket實現(xiàn)客戶端和服務(wù)端之間進行通信_第3頁
python利用socket實現(xiàn)客戶端和服務(wù)端之間進行通信_第4頁
python利用socket實現(xiàn)客戶端和服務(wù)端之間進行通信_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第python利用socket實現(xiàn)客戶端和服務(wù)端之間進行通信目錄一、socketsocket通信的條件:IP和端口形象比喻二、客戶端實現(xiàn)過程三、服務(wù)器實現(xiàn)過程四、演示五、實現(xiàn)持續(xù)通信過程前言:

今天教大家通過Python進行Socket網(wǎng)絡(luò)編程(做一個聊天程序),可以實現(xiàn)在不同的主機(電腦)之間進行通話。

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

可以看到客戶端(上方)向服務(wù)器端(下方)發(fā)送了內(nèi)容,服務(wù)器端進行了回復(fù)

【備注:客戶端是我的本機,服務(wù)器是另一條主機(阿里云服務(wù)器)】

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

一、socket

先簡單給大家介紹一下什么是socket,socket(簡稱套接字)是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:它能實現(xiàn)不同主機間的進程間通信。

我們網(wǎng)絡(luò)上各種各樣的服務(wù)大多都是基于Socket來完成通信的,例如瀏覽網(wǎng)頁、QQ聊天、收發(fā)email等等

簡單的說:socket可以實現(xiàn)不同主機間進行通信

socket通信的條件:IP和端口

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

主機中的數(shù)據(jù)是通過端口發(fā)送和接收,需要將對應(yīng)端口打開才能進行通信。

形象比喻

ip相當(dāng)于家庭地址,端口相當(dāng)于門或者窗戶

例子:

(主機A)快遞員要想將快遞(數(shù)據(jù))送到你手中(另一臺主機B),需要知道你家的地址(主機B的ip),到你家門口后,需要你打開門(主機B的端口)才能拿到快遞(數(shù)據(jù))。

這里需要分服務(wù)端和客戶端,客戶端發(fā)送(主機A),服務(wù)器接收(主機B),當(dāng)然了,每一臺主機可以充當(dāng)兩個角色(既是客戶端,也是服務(wù)器),這樣就可以實現(xiàn)兩臺主機之間相互發(fā)送和接收。

看到這里之后,相信大家都清楚socket在實現(xiàn)不同主機之間通信的大概意思了,下面開始Python代碼實現(xiàn)。

二、客戶端實現(xiàn)過程

先來分析客戶端(主機A)的實現(xiàn)過程:

fromsocketimport*

#1.創(chuàng)建套接字

tcp_socket=socket(AF_INET,SOCK_STREAM)

#2.準備連接服務(wù)器,建立連接

serve_ip="服務(wù)器端(主機B)的IP"

serve_port=8000#端口,比如8000

tcp_socket.connect((serve_ip,serve_port))#連接服務(wù)器,建立連接,參數(shù)是元組形式

首先與服務(wù)器接收端(主機B)建立連接,連接條件(主機B的ip和端口),這里的端口8000是指將數(shù)據(jù)發(fā)送到主機B的端口(主機B到時候會監(jiān)聽8000端口,然后進行接收數(shù)據(jù))

#準備需要傳送的數(shù)據(jù)

send_data="今天是2025年08月29日,辰哥給服務(wù)器端發(fā)送數(shù)據(jù)了"

tcp_socket.send(send_data.encode("gbk"))

#從服務(wù)器接收數(shù)據(jù)

#注意這個1024byte,大小根據(jù)需求自己設(shè)置

from_server_msg=tcp_socket.recv(1024)

#加上.decode("gbk")可以解決亂碼

print(from_server_msg.decode("gbk"))

#關(guān)閉連接

tcp_socket.close()

send_data是往服務(wù)器端(主機B)發(fā)送的內(nèi)容,from_server_msg是服務(wù)器端(主機B)往客戶端(主機A)發(fā)送的內(nèi)容

客戶端的代碼就結(jié)束了

三、服務(wù)器實現(xiàn)過程

分析服務(wù)器端(主機B)的實現(xiàn)過程:

fromsocketimport*

#創(chuàng)建套接字

tcp_server=socket(AF_INET,SOCK_STREAM)

#綁定ip,port

#這里ip默認本機

address=('',8000)

tcp_server.bind(address)

#啟動被動連接

#多少個客戶端可以連接

tcp_server.listen(128)

#使用socket創(chuàng)建的套接字默認的屬性是主動的

#使用listen將其變?yōu)楸粍拥模@樣就可以接收別人的鏈接了

服務(wù)器端(主機B)ip可以留空(默認本機),端口8000(因為客戶端往8000端口發(fā)送數(shù)據(jù),所以服務(wù)器需要監(jiān)聽的端口也是8000,與客戶端的端口一致)

#創(chuàng)建接收

#如果有新的客戶端來鏈接服務(wù)器,那么就產(chǎn)生一個新的套接字專門為這個客戶端服務(wù)

client_socket,clientAddr=tcp_server.accept()

client_socket用來為這個客戶端服務(wù),相當(dāng)于的tcp_server套接字的代理

tcp_server_socket就可以省下來專門等待其他新客戶端的鏈接

這里clientAddr存放的就是連接服務(wù)器的客戶端地址

#接收對方發(fā)送過來的數(shù)據(jù)

from_client_msg=client_socket.recv(1024)#接收1024給字節(jié),這里recv接收的不再是元組,區(qū)別UDP

print("接收的數(shù)據(jù):",from_client_msg.encode("gbk"))

#發(fā)送數(shù)據(jù)給客戶端

send_data=client_socket.send("客戶端你好,服務(wù)器端收到,公眾號【Python研究者】".encode("gbk"))

#關(guān)閉套接字

#關(guān)閉為這個客戶端服務(wù)的套接字,就意味著為不能再為這個客戶端服務(wù)了

#如果還需要服務(wù),只能再次重新連

client_socket.close()

from_client_msgs是服務(wù)器端(主機B)接收到來自客戶端(主機A)發(fā)送過來的數(shù)據(jù)send_data是服務(wù)器端(主機B)往客戶端(主機A)發(fā)送過去的數(shù)據(jù)

服務(wù)器端的代碼就結(jié)束了

提醒:服務(wù)器端的8000端口需要開啟,不然無法進行通信

四、演示

先啟動(執(zhí)行)服務(wù)器端(主機B)的程序,再執(zhí)行客戶端(主機A)

可以看到客戶端(上方)向服務(wù)器端(下方)發(fā)送了內(nèi)容,服務(wù)器端進行了回復(fù)

發(fā)送和響應(yīng)內(nèi)容:

客戶端發(fā)送:今天是2025年08月29日,辰哥給服務(wù)器端發(fā)送數(shù)據(jù)了

服務(wù)器端接收并回復(fù)給客戶端:客戶端你好,服務(wù)器端收到,公眾號【Python研究者】

五、實現(xiàn)持續(xù)通信過程

上方動圖演示的是客戶端和服務(wù)端的一次通信過程,可以將客戶端的發(fā)送和服務(wù)端的接收放到循環(huán)中,實現(xiàn)持續(xù)通信過程。

客戶端:

while(1):

send_data=input("請輸入內(nèi)容:")

#send_data="今天是2025年08月29日,辰哥給服務(wù)器端發(fā)送數(shù)據(jù)了"

tcp_socket.send(send_data.encode("gbk"))

ifsend_data=="exit":

break;

#從服務(wù)器接收數(shù)據(jù)

#注意這個1024byte,大小根據(jù)需求自己設(shè)置

from_server_msg=tcp_socket.recv(1024)

#加上.decode("gbk")可以解決亂碼

print(from_server_msg.decode("gbk"))

#關(guān)閉連接

tcp_socket.close()

服務(wù)端:

while(1):

#接收對方發(fā)送過來的數(shù)據(jù)

from_client_msg=client_socket.recv(1024)#接收1024給字節(jié),這里recv接收的不再是元組,區(qū)別UDP

if(from_client_msg=="exit"):

break

print("接收的數(shù)據(jù):",from_client_msg.decode("gbk"))

now_time=time.strftime('%Y-%m-%d%H:%M:%S',time.localtime(time.time()))

#發(fā)送數(shù)據(jù)給客戶端

send_data=client_socket.send((str(now_time)+"服務(wù)端:客戶端你好,服務(wù)器端收到,公眾號【Python研究者】").encode("gbk"))

#關(guān)閉套接字

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論