python 實(shí)現(xiàn)客戶(hù)端與服務(wù)端的通信
函數(shù)介紹
Socket對(duì)象方法:
服務(wù)端:
| 函數(shù) | 描述 |
|---|---|
| .bind() | 綁定地址關(guān)鍵字,AF_INET下以元組的形式表示地址。常用bind((host,port)) |
| .listen() | 監(jiān)聽(tīng)TCP,可以?huà)炱鸬淖畲筮B接數(shù),該值至少為1,一般設(shè)為5即可 |
| .accept() | 被動(dòng)接受TCP客戶(hù)端的連接 |
客戶(hù)端:
| 函數(shù) | 描述 |
|---|---|
| .connect() | 初始化服務(wù)器連接 |
| .connect_ex() | 是對(duì)connect()函數(shù)的擴(kuò)展,當(dāng)出錯(cuò)時(shí)返回出錯(cuò)碼,不報(bào)異常 |
其它函數(shù):
| 函數(shù) | 描述 |
|---|---|
| .recv() | 接收數(shù)據(jù),數(shù)據(jù)以字符串的形式返回,bufsize指定接收的最大數(shù)據(jù)量。 |
| .send() | 發(fā)送數(shù)據(jù),將string中的數(shù)據(jù)發(fā)送到連接的套接字,返回值是要發(fā)送的字節(jié)數(shù)量,通常使用.encode()函數(shù)對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)碼 |
| .senddall() | 發(fā)送完整的數(shù)據(jù),在返回之前會(huì)嘗試發(fā)送所有數(shù)據(jù),成功返回None,失敗則拋出異常。 |
| .recvfrom() | 與recv()函數(shù)類(lèi)似,不同的是返回值是(data,address),其中data是包含接收數(shù)據(jù)的字符串,address是發(fā)送數(shù)據(jù)的套接字地址。 |
| .sendto() | 發(fā)送UDP數(shù)據(jù),將數(shù)據(jù)發(fā)送到套接字,形式是(ipaddr,port)的元組。 |
| .close() | 關(guān)閉套接字 |
服務(wù)端
使用socket函數(shù)來(lái)創(chuàng)建一個(gè)socket對(duì)象,并設(shè)置一個(gè)socket服務(wù),然后通過(guò)bind(hostname,port)函數(shù)來(lái)指定一個(gè)端口,使用socket對(duì)象的accept方法,等待客戶(hù)端的連接,并返回connection對(duì)象。
具體步驟為:
創(chuàng)建服務(wù)端套接字 serversocket=socket() 把地址綁定到套接字 serversocket.bind() 對(duì)連接進(jìn)行監(jiān)聽(tīng) serversocket.listen() 使用一個(gè)while進(jìn)行循環(huán),并接收客戶(hù)端的連接 while True: serverclient=serversocket.accept() while True: #接收已發(fā)送 serverclient.recv() serverclient.send() #關(guān)閉客戶(hù)端套接字 serverclient.close() 關(guān)閉服務(wù)端套接字 serversocket.close()
具體代碼實(shí)現(xiàn):
import socket
import sys
import time
serversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()#獲取本地主機(jī)名
port=9999
#綁定端口號(hào)
serversocket.bind((host,port))
#設(shè)置最大連接數(shù)
serversocket.listen(5)
while True:
print('服務(wù)器啟動(dòng),監(jiān)聽(tīng)客戶(hù)端鏈接')
clientsocket,addr=serversocket.accept()
print('鏈接地址:%s' % str(addr))
while True:
try:
data=clientsocket.recv(1024)
except Exception:
print('斷開(kāi)的客戶(hù)端:',addr)
break
print('客戶(hù)端發(fā)送內(nèi)容:',data.decode('utf-8'))
reply=input('回復(fù):').strip()
if not reply:
break
msg=time.strftime('%Y-%m-%d %X')#獲取結(jié)構(gòu)化時(shí)間戳
msg1='[%s]:%s'% (msg,reply)
clientsocket.send(msg1.encode('utf-8'))
clientsocket.close()
serversocket.closel()
實(shí)現(xiàn)功能:通過(guò)while實(shí)現(xiàn)循環(huán)接收客戶(hù)端發(fā)送的數(shù)據(jù),并對(duì)客戶(hù)端發(fā)送的數(shù)據(jù)進(jìn)行顯示并返回給客戶(hù)端數(shù)據(jù),返回給客戶(hù)端的數(shù)據(jù)信息后加入時(shí)間戳。
客戶(hù)端
創(chuàng)建一個(gè)客戶(hù)端用來(lái)連接以上服務(wù)的的服務(wù),使用socket.connect()方法打開(kāi)一個(gè)TCP連接到主機(jī),連接后可以從服務(wù)端獲取數(shù)據(jù),在操作完成后關(guān)閉連接。 具體步驟為: ``` 創(chuàng)建客戶(hù)端的套接字 client=socket() 嘗試連接服務(wù)器 client.connect() 發(fā)送并接收數(shù)據(jù) client.send() client.recv() 關(guān)閉客戶(hù)端套接字 client.close() ``` **具體代碼實(shí)現(xiàn):**
import socket
import sys
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()
port=9999
s.connect((host,port))
while True:
data= input('>>').strip()
if not data:
break
s.send(data.encode('utf-8'))
msg=s.recv(1024)
if not msg:
break
print(msg.decode('utf-8'))
s.close()
測(cè)試
使用cmd命令行中打開(kāi)到代碼所在文件目錄,執(zhí)行python 服務(wù)端文件名.py,再另打開(kāi)一個(gè)cmd命令界面執(zhí)行 python 客戶(hù)端文件名.py
在pycharm中運(yùn)行服務(wù)端代碼,運(yùn)行結(jié)果:

在cmd中運(yùn)行客戶(hù)端代碼,運(yùn)行結(jié)果:

以上就是python 實(shí)現(xiàn)客戶(hù)端與服務(wù)端的通信的詳細(xì)內(nèi)容,更多關(guān)于python 客戶(hù)端與服務(wù)端的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python thrift搭建服務(wù)端和客戶(hù)端測(cè)試程序
- python thrift 實(shí)現(xiàn) 單端口多服務(wù)的過(guò)程
- python3.7通過(guò)thrift操作hbase的示例代碼
- python使用thrift教程的方法示例
- python利用thrift服務(wù)讀取hbase數(shù)據(jù)的方法
- python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù))
- Python連接Java Socket服務(wù)端的實(shí)現(xiàn)方法
- python網(wǎng)絡(luò)編程socket實(shí)現(xiàn)服務(wù)端、客戶(hù)端操作詳解
- Python Websocket服務(wù)端通信的使用示例
- python實(shí)現(xiàn)Thrift服務(wù)端的方法
相關(guān)文章
Python自動(dòng)創(chuàng)建Markdown表格使用實(shí)例探究
Markdown表格是文檔中整理和展示數(shù)據(jù)的重要方式之一,然而,手動(dòng)編寫(xiě)大型表格可能會(huì)費(fèi)時(shí)且容易出錯(cuò),本文將介紹如何使用Python自動(dòng)創(chuàng)建Markdown表格,通過(guò)示例代碼詳細(xì)展示各種場(chǎng)景下的創(chuàng)建方法,提高表格生成的效率2024-01-01
Python自動(dòng)化辦公之Word文件內(nèi)容的讀取
word、excel、PPT,雖然說(shuō)是特殊文件,其實(shí)也是實(shí)際工作中我們經(jīng)常會(huì)用到的文件類(lèi)型。本文將為大家詳解Python讀取Word文件和文件內(nèi)容的方法,感興趣的可以了解一下2022-05-05
利用pyproj將經(jīng)緯度投影為平面坐標(biāo)以及地理坐標(biāo)系背景知識(shí)解讀
這篇文章主要介紹了利用pyproj將經(jīng)緯度投影為平面坐標(biāo)以及地理坐標(biāo)系背景知識(shí)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Python中使用glob和rmtree刪除目錄子目錄及所有文件的例子
這篇文章主要介紹了python中使用glob和rmtree刪除目錄子目錄及所有文件的例子,需要的朋友可以參考下2014-11-11
Python一文入門(mén)Flask?Blueprint?SQLAlchemy部分詳解
這篇文章主要為大家介紹了Python一文入門(mén)Flask?Blueprint?SQLAlchemy部分詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
使用Python中OpenCV和深度學(xué)習(xí)進(jìn)行全面嵌套邊緣檢測(cè)
這篇文章主要介紹了使用Python中OpenCV和深度學(xué)習(xí)進(jìn)行全面嵌套邊緣檢測(cè),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
scrapy自定義pipeline類(lèi)實(shí)現(xiàn)將采集數(shù)據(jù)保存到mongodb的方法
這篇文章主要介紹了scrapy自定義pipeline類(lèi)實(shí)現(xiàn)將采集數(shù)據(jù)保存到mongodb的方法,涉及scrapy采集及操作mongodb數(shù)據(jù)庫(kù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
selenium?drag_and_drop不生效的解決辦法
本文主要介紹了selenium?drag_and_drop不生效的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

