概述:通信數(shù)據(jù)交換方式分為幾種模式:全雙工、半雙工和單工數(shù)據(jù)傳輸;
問題:什么是全雙工、半雙工和單工?
解釋: 全雙工(Full Duplex)是通訊傳輸?shù)囊粋€術(shù)語。
通信允許數(shù)據(jù)在兩個方向上同時傳輸,它在能力上相當(dāng)于兩個單工通信方式的結(jié)合。全雙工指可以同時(瞬時)進(jìn)行信號的雙向傳輸(A→B且B→A)。指A→B的同時B→A,是瞬時同步的,四線制。
單工就是在只允許甲方向乙方傳送信息,而乙方不能向甲方傳送 。
半雙工(Half Duplex)數(shù)據(jù)傳輸指數(shù)據(jù)可以在一個信號載體的兩個方向上傳輸,但是不能同時傳輸。例如,在一個局域網(wǎng)上使用具有半雙工傳輸?shù)募夹g(shù),一個工作站可以在線上發(fā)送數(shù)據(jù),然后立即在線上接收數(shù)據(jù),這些數(shù)據(jù)來自數(shù)據(jù)剛剛傳輸?shù)姆较颉O袢p工傳輸一樣,半雙工包含一個雙向線路,兩線制。
網(wǎng)絡(luò)編程:對于python而言,同樣支持udp和tcp協(xié)議完成全雙工、半雙工和單工的網(wǎng)絡(luò)通信,本篇文章淺析python的udp協(xié)議實現(xiàn)單工、半雙工,全雙工后面文章分析;
python在網(wǎng)絡(luò)編程方面提供了socket標(biāo)準(zhǔn)庫用以開發(fā)實現(xiàn)單工、半雙工的網(wǎng)絡(luò)編程;
具體有以下幾個關(guān)鍵方法:
socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 創(chuàng)建udp協(xié)議的套接字
socket.bind(loc_addres) # 綁定地址和端口,注意一個參數(shù),元祖類型;
socket.sendto(b"發(fā)送內(nèi)容byte類型",(send_ip,send_port)) # sendto方法兩個參數(shù),發(fā)送內(nèi)容和發(fā)送目的機(jī)器ip地址和端口,機(jī)器ip和端口是元祖類型;
socket.recvfrom(1024) # 接受內(nèi)容,一個參數(shù)單次接受字節(jié)數(shù)大小;
socket.close() # 關(guān)閉套接字
單工介紹如下:
先實現(xiàn)發(fā)送部分代碼:
import socket
def main():
"""實現(xiàn)簡單的udp協(xié)議單工"""
# 創(chuàng)建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 綁定程序端口,如不綁定運行后系統(tǒng)隨機(jī)分配
loc_addres = ("",5566)
udp_socket.bind(loc_addres)
while True:
# 發(fā)送數(shù)據(jù)的ip和端口
send_ip = input("請輸入目的機(jī)器的ip:")
send_port = int(input("請輸入目的機(jī)器的端口:"))
# 發(fā)送內(nèi)容,不同機(jī)器有不同編碼格式,在發(fā)送時候需要關(guān)注轉(zhuǎn)碼
send_data = input("請輸入你需要發(fā)送的內(nèi)容:")
if send_data == "exit":
break
else:
udp_socket.sendto(send_data.encode("utf-8"),(send_ip,send_port)) # 發(fā)送目的內(nèi)容和目的機(jī)器ip和端口,元祖類型
#關(guān)閉套接字
udp_socket.close()
if __name__ =="__main__":
main()
接收部分代碼如下:
import socket
def main():
"""實現(xiàn)簡單的udp協(xié)議單工調(diào)試工具"""
# 創(chuàng)建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 綁定程序端口,如不綁定運行后系統(tǒng)隨機(jī)分配
loc_addres = ("",7788)
udp_socket.bind(loc_addres)
while True:
# 接收其他機(jī)器發(fā)送的數(shù)據(jù)
udp_data = udp_socket.recvfrom(1024)
if str(udp_data[1]) == "exit":
break
else:
# 打印接收到的內(nèi)容
print("%s,%s" %(str(udp_data[1]),udp_data[0].decode("gbk")))
#關(guān)閉套接字
udp_socket.close()
if __name__ =="__main__":
main()
調(diào)試效果如下:
半雙工模式如下:
發(fā)送部分實現(xiàn)代碼:
import socket
def send_msg(udp_socket):
"""發(fā)送數(shù)據(jù)部分"""
# 發(fā)送數(shù)據(jù)的ip和端口
send_ip = input("請輸入目的機(jī)器的ip:")
send_port = int(input("請輸入目的機(jī)器的端口:"))
# 發(fā)送內(nèi)容,不同機(jī)器有不同編碼格式,在發(fā)送時候需要關(guān)注轉(zhuǎn)碼
send_data = input("請輸入你需要發(fā)送的內(nèi)容:")
# 發(fā)送數(shù)據(jù)
udp_socket.sendto(send_data.encode("utf-8"),(send_ip,send_port)) # 發(fā)送目的內(nèi)容和目的機(jī)器ip和端口,元祖類型
def recv_msg(udp_socket):
"""接收數(shù)據(jù)部分"""
udp_data = udp_socket.recvfrom(1024) # 接收目的機(jī)器的發(fā)送內(nèi)容
print("%s,%s" %(str(udp_data[1]),udp_data[0].decode("gbk")))
def main():
"""實現(xiàn)簡單的udp協(xié)議的聊天工具"""
# 創(chuàng)建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 綁定程序端口,如不綁定運行后系統(tǒng)隨機(jī)分配
loc_addres = ("",7799)
udp_socket.bind(loc_addres)
while True:
print("-------*****聊天工具v-0.1-----------")
print("輸入0發(fā)送數(shù)據(jù)")
print("輸入1接受數(shù)據(jù)")
print("輸入2退出")
req = input("請輸入你需要的功能:")
if req == "0":
send_msg(udp_socket)
elif req == "1":
recv_msg(udp_socket)
elif req == "2":
break
else:
print("輸入有誤請重新輸入:")
#關(guān)閉套接字
udp_socket.close()
if __name__ =="__main__":
main()
如果在本機(jī)調(diào)試修改綁定地址端口即可:
# 綁定程序端口,如不綁定運行后系統(tǒng)隨機(jī)分配
loc_addres = ("",5566)
udp_socket.bind(loc_addres)
調(diào)試結(jié)果如下:
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
