Ⅰ 服務端通過UDP接收的數據能否多線程處理
多線程並不能提高執行效率,相反,由於多了線程切換,會有一丁點額外開銷
多線程能提高交互和響應效率。
原因是cpu只能一條一條指令的做。
如果是多核編程或多處理器編程,那就肯定能快了。
Ⅱ python 網路客戶端和服務端udp和select都能實現並發,有啥區別呢!
簡單來說:沒什麼區別!因為UDP本來就是報文,也就是「發出後不管」,因此返回極快,根本不會阻塞進程,接收時也是檢查一下緩沖區後立刻返回,同樣不阻塞進程。既然都是不阻塞進程的,因此select也就多餘了!
Ⅲ Python3 & TCP協議和UDP協議的特點和區別
優點:
(1)TCP是面向連接的運輸層協議;
(2)每一條TCP連接只能有兩個端點(即兩個套接字),只能是點對點的;
(3)TCP提供可靠的傳輸服務。傳送的數據無差錯、不丟失、不重復、按序到達;
(4)TCP提供全雙工通信。允許通信雙方的應用進程在任何時候都可以發送數據,因為兩端都設有發送緩存和接受緩存;
(5)面向位元組流。雖然應用程序與TCP交互是一次一個大小不等的數據塊,但TCP把這些數據看成一連串無結構的位元組流,它不保證接收方收到的數據塊和發送方發送的數據塊具有對應大小關系,例如,發送方應用程序交給發送方的TCP10個數據塊,但就受訪的TCP可能只用了4個數據塊久保收到的位元組流交付給上層的應用程序,但位元組流完全一樣。
缺點:
慢,效率低,佔用系統資源高,易被攻擊 TCP在傳遞數據之前,要先建連接,這會消耗時間,在數據傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,而且要在每台設備上維護所有的傳輸連接。事實上,每個連接都會佔用系統的CPU、內存等硬體資源。因為TCP有確認機制、三次握手機制,這些也導致TCP容易被人利用,實現DOS、DDOS、CC等攻擊。
TCP的應用場景:
當對網路通訊質量有要求的時候。例如:整個數據要准確無誤的傳遞給對方,這往往用於一些要求可靠的應用。如:用於文件傳輸(FTP HTTP 對數據准確性要求高,速度可以相對慢),發送或接收郵件(POP IMAP SMTP 對數據准確性要求高,非緊急應用),遠程登錄(TELNET SSH 對數據准確性有一定要求,有連接的概念)等等。
優點:
(1)UDP是無連接的傳輸層協議;
(2)UDP使用盡最大努力交付,不保證可靠交付;
(3)UDP是面向報文的,對應用層交下來的報文,不合並,不拆分,保留原報文的邊界;
(4)UDP沒有擁塞控制,因此即使網路出現擁塞也不會降低發送速率;
(5)UDP支持一對一一對多多對多的交互通信;
(6)UDP的首部開銷小,只有8位元組.
缺點:
不可靠,不穩定。 因為UDP沒有TCP那些可靠的機制,在數據傳遞時,如果網路質量不好,就會很容易丟包。
UDP的應用場景:
當對網路通訊質量要求不高的時候,要求網路通訊速度能盡量的快,這時就可以使用UDP。 UDP一般用於即時通信(QQ聊天 對數據准確性和丟包要求比較低,但速度必須快),在線視頻(RTSP 速度一定要快,保證視頻連續,但是偶爾花了一個圖像幀,人們還是能接受的),網路語音電話(VoIP 語音數據包一般比較小,需要高速發送,偶爾斷音或串音也沒有問題)等等。
(1)TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
(2)TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保證可靠交付
(3)TCP面向位元組流,實際上是TCP把數據看成一連串無結構的位元組流;UDP是面向報文的UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
(4)每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
(5)TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組
(6)TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
HTTP、HTTPS、FTP、TELNET、SMTP(簡單郵件傳輸協議)協議基於可靠的TCP協議。TFTP、DNS、DHCP、TFTP、SNMP(簡單網路管理協議)、RIP基於不可靠的UDP協議
Ⅳ python語言基礎知識是什麼
如下:
一、Python語言基礎
Python核心:Python數據基本運算、語句、容器、函數
Python 面向對象編程:OOA、OOD、OOP、天龍八部技能系統框架 設計 Python高級:模塊、包、函數式編程、文件。
二、Python高級軟體開發技術
Linux操作系統 :Linux常用命令、編輯工具、vim/Pycharm
數據結構與演算法 :鏈表、棧和隊列、樹和二叉樹、查找排序
IO網路編程:文件操作、位元組流讀寫、網路協議、套接 字、TCP/UDP
並發編程:多進程、進程池、進程通信、多線程、線程鎖、多任務並發、IO模型、協程
Python 正則表達式:正則表達式、貪婪模和非貪婪模式、re模塊
MySQL基礎:資料庫應用、SQL語言、Mysql增刪改查、 pymysql模塊
三、Python Web全棧式工程師
HTML/CSS HTML5標簽,CSS選擇器,CSS樣式屬性以 及值
Java :JS流程式控制制,DOM,BOM,JQuery API
MySQL高級:MySQL索引、事務、引擎、優化、pymysql 模塊使用
Python Django 框架:Django、模板、視圖、模型、請求對象等
Ajax Ajax,:JSON, Jquery對Ajax的支持, 跨域訪問
四、Python 爬蟲
Redis:Redis、string、hash、list、set、zset、 Python與MySQL和Redis結合
爬蟲、HTTP、BeautifulSoup,XPath,Scrapy其實無論是學習什麼知識,都要有一個對學習目標的清楚認識。 只有這樣才能朝著目標持續前進,少走彎路,從學習中得到不斷的提升,享受python學習計劃的過程。
Ⅳ 如何用python方法檢測UDP埠
本文實例講述了python檢測遠程udp埠是否打開的方法。分享給大家供大家參考。具體實現方法如下:
復制代碼代碼如下:
import socket
import threading
import time
import struct
import Queue
queue = Queue.Queue()
def udp_sender(ip,port):
try:
ADDR = (ip,port)
sock_udp = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock_udp.sendto("abcd...",ADDR)
sock_udp.close()
except:
pass
def icmp_receiver(ip,port):
icmp = socket.getprotobyname("icmp")
try:
sock_icmp = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
except socket.error, (errno, msg):
if errno == 1:
# Operation not permitted
msg = msg + (
" - Note that ICMP messages can only be sent from processes"
" running as root."
)
raise socket.error(msg)
raise # raise the original error
sock_icmp.settimeout(3)
try:
recPacket,addr = sock_icmp.recvfrom(64)
except:
queue.put(True)
return
icmpHeader = recPacket[20:28]
icmpPort = int(recPacket.encode('hex')[100:104],16)
head_type, code, checksum, packetID, sequence = struct.unpack(
"bbHHh", icmpHeader
)
sock_icmp.close()
if code == 3 and icmpPort == port and addr[0] == ip:
queue.put(False)
return
def checker_udp(ip,port):
thread_udp = threading.Thread(target=udp_sender,args=(ip,port))
thread_icmp = threading.Thread(target=icmp_receiver,args=(ip,port))
thread_udp.daemon= True
thread_icmp.daemon = True
thread_icmp.start()
time.sleep(0.1)
thread_udp.start()
thread_icmp.join()
thread_udp.join()
return queue.get(False)
if __name__ == '__main__':
import sys
print checker_udp(sys.argv[1],int(sys.argv[2]))
希望本文所述對大家的Python程序設計有所幫助。
Ⅵ python保存udp報文到文件
1.新建文件tcp_server.py,用於模擬server端。
import socket
tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 創建socket對象,走tcp通道
host = socket.gethostname() # 獲取本地主機名
port = 1000 # 埠號
addr = (host, port)
tcpServer.bind(addr) # 綁定地址
tcpServer.listen(5) # 設置最大連接數,超過後排隊
while True:
conn,addr = tcpServer.accept() # 建立客戶端連接
print(conn)
data = conn.recv(1024) # 接收來自客戶端的數據,小於1024位元組
print(data)
msg = 'Hello Client'.encode('utf-8')
conn.send(msg) # 發送數據給客戶端
conn.close() # 關閉連接
本地主機名也可以換成IP地址,如host = '192.168.1.100'
server 端需要一直運行,等待 client 端的連接,所以使用while True無限循環
發送的數據必須是bytes類型,所以字元串需要編碼'Hello Client'.encode('utf-8'),編碼後為bytes類型
2.新建文件tcp_client.py,用於模擬client端。
import socket
tcpClient = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 創建socket對象
host = socket.gethostname()
port = 1000
addr = (host, port)
tcpClient.connect(addr) # 連接服務,指定主機和埠號
data = b'\x01\x64\xff' # 報文數據,bytes類型
tcpClient.send(data) # 發送數據給服務端
msg = tcpClient.recv(1024) # 接收來自服務端的數據,小於1024位元組
print(msg.decode('utf-8'))
tcpClient.close()
client 端的地址需與 server 端一致,否則會報錯:
IP地址不一致,則會發送數據給其他伺服器,可能會出現報錯TimeoutError
埠號不一致,會出現報錯ConnectionRefusedError
3.打開兩個cmd窗口,一個為server端窗口,另一個為client端窗口。
運行順序,先啟動server,後啟動client:
server端窗口,先執行命令python tcp_server.py;client端窗口,後執行命令python tcp_client.py 。
Ⅶ python需要學習什麼內容
Python的學習內容還是比較多的,我們將學習的過程劃分為4個階段,每個階段學習對應的內容,具體的學習順序如下:
Python學習順序:
①Python軟體開發基礎
掌握計算機的構成和工作原理
會使用Linux常用工具
熟練使用Docker的基本命令
建立Python開發環境,並使用print輸出
使用Python完成字元串的各種操作
使用Python re模塊進行程序設計
使用Python創建文件、訪問、刪除文件
掌握import 語句、From…import 語句、From…import* 語句、方法的引用、Python中的包
②Python軟體開發進階
能夠使用Python面向對象方法開發軟體
能夠自己建立資料庫,表,並進行基本資料庫操作
掌握非關系資料庫MongoDB的使用,掌握Redis開發
能夠獨立完成TCP/UDP服務端客戶端軟體開發,能夠實現ftp、http伺服器,開發郵件軟體
能開發多進程、多線程軟體
③Python全棧式WEB工程師
能夠獨立完成後端軟體開發,深入理解Python開發後端的精髓
能夠獨立完成前端軟體開發,並和後端結合,熟練掌握使用Python進行全站Web開發的技巧
④Python多領域開發
能夠使用Python熟練編寫爬蟲軟體
能夠熟練使用Python庫進行數據分析
招聘網站Python招聘職位數據爬取分析
掌握使用Python開源人工智慧框架進行人工智慧軟體開發、語音識別、人臉識別
掌握基本設計模式、常用演算法
掌握軟體工程、項目管理、項目文檔、軟體測試調優的基本方法
互聯網行業目前還是最熱門的行業之一,學習IT技能之後足夠優秀是有機會進入騰訊、阿里、網易等互聯網大廠高薪就業的,發展前景非常好,普通人也可以學習。
想要系統學習,你可以考察對比一下開設有相關專業的熱門學校,好的學校擁有根據當下企業需求自主研發課程的能力,中博軟體學院、南京課工場、南京北大青鳥等開設python專業的學校都是不錯的,建議實地考察對比一下。
祝你學有所成,望採納。
Ⅷ Python搭建的udp伺服器一直錯誤,不知道什麼問題,找了個成功的我電腦也不響應
排查發現是防火牆的問題:
解決方案:
單獨設置某個應用示是否可以通過防火牆進行通信
打開防火牆後,可以接收到udp信息了(或者,關閉一下防火牆,再測試)
Ⅸ Python網路編程 -- TCP/IP
首先放出一個 TCP/IP 的程序,這里是單線程伺服器與客戶端,在多線程一節會放上多線程的TCP/IP服務程序。
這里將服務端和客戶端放到同一個程序當中,方便對比服務端與客戶端的不同。
TCP/IP是網際網路的通信協議,其參考OSI模型,也採用了分層的方式,對每一層制定了相應的標准。
網際協議(IP)是為全世界通過互聯網連接的計算機賦予統一地址系統的機制,它使得數據包能夠從互聯網的一端發送至另一端,如 130.207.244.244,為了便於記憶,常用主機名代替IP地址,例如 .com。
UDP (User Datagram Protocol,用戶數據報協議) 解決了上述第一個問題,通過埠號來實現了多路復用(用不同的埠區分不同的應用程序)但是使用UDP協議的網路程序需要自己處理丟包、重包和包的亂序問題。
TCP (Transmission Control Protocol,傳輸控制協議) 解決了上述兩個問題,同樣使用埠號實現了復用。
TCP 實現可靠連接的方法:
socket通信模型及 TCP 通信過程如下兩張圖。
[圖片上傳失敗...(image-6d947d-1610703914730)]
[圖片上傳失敗...(image-30b472-1610703914730)]
socket.getaddrinfo(host, port, family, socktype, proto, flags)
返回: [(family, socktype, proto, cannonname, sockaddr), ] 由元組組成的列表。
family:表示socket使用的協議簇, AF_UNIX : 1, AF_INET: 2, AF_INET6 : 10。 0 表示不指定。
socktype: socket 的類型, SOCK_STREAM : 1, SOCK_DGRAM : 2, SOCK_RAW : 3
proto: 協議, 套接字所用的協議,如果不指定, 則為 0。 IPPROTO_TCP : 6, IPPRTOTO_UDP : 17
flags:標記,限制返回內容。 AI_ADDRCONFIG 把計算機無法連接的所有地址都過濾掉(如果一個機構既有IPv4,又有IPv6,而主機只有IPv4,則會把 IPv6過濾掉)
AI _V4MAPPED, 如果本機只有IPv6,服務卻只有IPv4,這個標記會將 IPv4地址重新編碼為可實際使用的IPv6地址。
AI_CANONNAME,返回規范主機名:cannonname。
getaddrinfo(None, 'smtp', 0, socket.SOCK_STREAM, 0, socket.AP_PASSIVE)
getaddrinfo('ftp.kernel.org', 'ftp', 0, 'socket.SOCK_STREAM, 0, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED)
利用已經通信的套接字名提供給getaddrinfo
mysock = server_sock.accept()
addr, port = mysock.getpeername()
getaddrinfo(addr, port, mysock.family, mysock.type, mysock.proto, socket.AI_CANONNAME)
TCP 數據發送模式:
由於 TCP 是發送流式數據,並且會自動分割發送的數據包,而且在 recv 的時候會阻塞進程,直到接收到數據為止,因此會出現死鎖現象,及通信雙方都在等待接收數據導致無法響應,或者都在發送數據導致緩存區溢出。所以就有了封幀(framing)的問題,即如何分割消息,使得接收方能夠識別消息的開始與結束。
關於封幀,需要考慮的問題是, 接收方何時最終停止調用recv才是安全的?整個消息或數據何時才能完整無缺的傳達?何時才能將接收到的消息作為一個整體來解析或處理。
適用UDP的場景:
由於TCP每次連接與斷開都需要有三次握手,若有大量連接,則會產生大量的開銷,在客戶端與伺服器之間不存在長時間連接的情況下,適用UDP更為合適,尤其是客戶端太多的時候。
第二種情況: 當丟包現象發生時,如果應用程序有比簡單地重傳數據聰明得多的方法的話,那麼就不適用TCP了。例如,如果正在進行音頻通話,如果有1s的數據由於丟包而丟失了,那麼只是簡單地不斷重新發送這1s的數據直至其成功傳達是無濟於事的。反之,客戶端應該從傳達的數據包中任意選擇一些組合成一段音頻(為了解決這一問題,一個智能的音頻協議會用前一段音頻的高度壓縮版本作為數據包的開始部分,同樣將其後繼音頻壓縮,作為數據包的結束部分),然後繼續進行後續操作,就好像沒有發生丟包一樣。如果使用TCP,那麼這是不可能的,因為TCP會固執地重傳丟失的信息,即使這些信息早已過時無用也不例外。UDP數據報通常是互聯網實時多媒體流的基礎。
參考資料:
Ⅹ python udp多線程的問題
for out_port in self.output_port:
soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
soc.connect(("localhost",out_port))
_output.append(soc)
不要用output_port,用input_port。
你這里是往input_port發送數據,不需要關心自己的port,而是對端的port