Python網(wǎng)絡通訊之TCP協(xié)議實現(xiàn)服務器和客戶端實例
前言:
上一期我們初步學習了解了網(wǎng)絡通訊的概念(網(wǎng)絡編程之網(wǎng)絡與通信介紹),那么這一期我們就接著學習通過網(wǎng)絡編程來實現(xiàn)服務器和客戶端之間的信息傳送。
Socket編程
1.簡介
socket編程一種獨立于協(xié)議的網(wǎng)絡編程接口,應用程序可以通過它發(fā)送或接收數(shù)據(jù),可對其進行像對文件一樣的打開、讀寫和關閉等操作。
Socket是應用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。
2. Python中的socket
在Python當中已有一個socket封裝好的模塊,當我們想通過Python去實現(xiàn)socket編程的時候,只需要把這個模塊導入就行了,然后按照里面的方法就可以去搭建一個局域網(wǎng)的服務器和用戶端。
導入模塊
import socket
服務器的實現(xiàn)
每次當我們在微信、QQ上發(fā)送一條信息的時候,我們發(fā)送的信息會通過局域網(wǎng)然后傳遞到公網(wǎng)上,再傳入到綁定公網(wǎng)的服務器當中,然后服務器再通過網(wǎng)絡協(xié)議往下傳給接收者。網(wǎng)絡通訊大概就是這么一個過程,那這里我通過tcp協(xié)議來去實現(xiàn)局域網(wǎng)直接的服務器的代碼
import random
import socket
#1.創(chuàng)建服務器對象
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 參數(shù)1:socket.AF_INET, 表示 ipv4地址
# 參數(shù)2:socket.SOCK_STREAM表示 tcp協(xié)議封裝好的參數(shù)
#2.獲取當前計算機地址的代碼
p=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
p.connect(('8.8.8.8',80))
nowip=p.getsockname()[0]
p.close()
port=8888
print('當前的ip地址:',nowip)
print('當前端口號:',port)
#3.把服務器綁定到本計算機上
server.bind((nowip,port))
#4.設置監(jiān)聽模式,設置最大的監(jiān)聽數(shù)
server.listen(128) #設置最大的連接數(shù)128
print('服務端已啟動,等待連接……')
#5.等待客戶的連接
conn, addr = server.accept()
# conn 是連接客戶端的套接字對象
# addr 是表示客戶端的連接地址
while 1:
try:
#6.接受客戶端的數(shù)據(jù)
#網(wǎng)絡數(shù)據(jù)都是以字節(jié)流的形式去發(fā)送的
data=conn.recv(1024).decode('utf8') #參數(shù)1024表示每次接受最大的字節(jié)數(shù),decode進行解碼,由字節(jié)流編碼轉換為字符
if not data:#當接受到空數(shù)據(jù)的時候就說明客戶端斷開了連接
print(f'{addr}斷開了連接')
break
print(f'----{addr}發(fā)送了----',data)
#7.返回一個0~100的隨機數(shù)數(shù)據(jù)給客戶端
conn.send(str(random.randint(0,100)).encode('utf8'))#進行字節(jié)流編碼發(fā)送
except ConnectionResetError:
print('error')
break
#7.關閉套接字對象
conn.close()
#8.關閉服務器
server.close()用戶端的實現(xiàn)
客戶端的代碼實現(xiàn)也是跟服務器差不多的,實現(xiàn)要先去創(chuàng)建一個客戶端對象,然后連接到服務器的地址以及端口號,然后就可以去實現(xiàn)與服務器進行信息發(fā)送與接受了。代碼如下:
#客戶端
import socket
#1.創(chuàng)建客戶端對象
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.連接服務器地址和端口
client.connect(('10.33.110.204',8888))
count=1 #計數(shù)
while 1:
a=input(r'輸入你要發(fā)送的內容(\q退出):').strip()
if a==r'\q':
break
if not a: #當發(fā)送的數(shù)據(jù)為空時就重新輸入
print('發(fā)送的數(shù)據(jù)不能為空')
continue
#3.把數(shù)據(jù)發(fā)送給服務器
client.send(a.encode('utf8'))
#4.獲取到服務器發(fā)送的數(shù)據(jù)
data = client.recv(1024) # receive
if not data:
break
print(f'對方發(fā)送的消息--{count}--:',data.decode("utf8"))
count+=1
#5.關閉客戶端
client.close()
(注意:以上的代碼功能是在局域網(wǎng)內才能實現(xiàn)服務器和客戶端之間的信息發(fā)送與接受,如果兩臺設備連接不同的WiFi的話那就發(fā)送不了信息了)
到此這篇關于Python網(wǎng)絡通訊之TCP協(xié)議實現(xiàn)服務器和客戶端實例的文章就介紹到這了,更多相關PythonTCP協(xié)議實現(xiàn)服務器和客戶端內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
將tensorflow.Variable中的某些元素取出組成一個新的矩陣示例
今天小編就為大家分享一篇將tensorflow.Variable中的某些元素取出組成一個新的矩陣示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python實現(xiàn)OpenCV中文路徑圖片讀寫的詳細指南
在Python中使用OpenCV處理圖片時,涉及讀取和保存圖片的操作,可能會遇到中文路徑的兼容性問題,該指南的目的是展示如何正確處理帶有中文路徑的圖片,并使用OpenCV將圖片保存到指定的中文路徑,需要的朋友可以參考下2025-03-03

