網(wǎng)絡(luò)通信基本概述
- 網(wǎng)絡(luò)是什么?
- 網(wǎng)絡(luò)就是輔助雙方或多方連接在一起的工具
- 使用網(wǎng)絡(luò)的目的?
- 使連接網(wǎng)絡(luò)的多方,能進(jìn)行數(shù)據(jù)傳遞
- 網(wǎng)絡(luò)編程是什么?
- 就是讓在不同電腦上的軟件能進(jìn)行數(shù)據(jù)傳遞
- IP地址是什么?
- 用來在網(wǎng)絡(luò)中標(biāo)記一臺電腦,比如:192.168.1.1;在本地局域網(wǎng)內(nèi)是唯一的
- 查看本機(jī)ip地址
- 在dos命令窗口中,輸入:ipconfig
- 什么是端口?
- 端口是通過端口號來標(biāo)記的,范圍是從 0~65535
- 知名端口
- 眾所周知的端口號,范圍 0~1023,例如:80端口是http的,21端口是ftp用的
- 一般情況下,程序要使用知名端口是需要管理員權(quán)限的
- 動態(tài)端口
- 動態(tài)端口一般不固定,是動態(tài)分配的,范圍從 1024~65535
- 動態(tài)分配是指,當(dāng)一個(gè)程序需要網(wǎng)絡(luò)通信時(shí),它向主機(jī)申請一個(gè)端口,主機(jī)從可用的端口中分配一個(gè)供它使用,當(dāng)這個(gè)程序關(guān)閉時(shí),同時(shí)會釋放占用的端口
- 可以在命令窗口中輸入:** netstat -ano **查看端口狀態(tài)
socket概述
- 什么是socket?
- socket 簡稱 套接字 ,是進(jìn)程間通信的一種方式,它與其它進(jìn)程間通信的一個(gè)主要不同是:它能實(shí)現(xiàn)不同主機(jī)間的通信,例如:QQ、微信等
- 在Python中,使用socket 模塊的函數(shù) socket 來創(chuàng)建通信
語法
import socket
socket.socket(family,type)
參數(shù)說明
- **family: **可以選擇 AF_INET(用于Internet 進(jìn)程間通信) 或者 AF_UNIX (用于另一臺機(jī)器進(jìn)程間通信),實(shí)際工作中常用AF_INET
- Type: 套接字類型,可以是SOCK_STREAM(流式套接字,主要用于TCP協(xié)議) 或者 SOCK_DGRAM(數(shù)據(jù)報(bào)套接字,主要用于UDP協(xié)議)
**說明
**
- 套接字使用流程與文件使用流程類似
- 創(chuàng)建套接字
- 使用套接字收/發(fā)數(shù)據(jù)
- 關(guān)閉套接字
示例
import socket
# 創(chuàng)建TCP的套接字 (點(diǎn)對點(diǎn))
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 發(fā)送或者接收信息 ...
# 關(guān)閉套接字
s.close()
# 創(chuàng)建UDP的套接字 (一對多,廣播形式)
s2=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 發(fā)送或者接收信息 ...
# 關(guān)閉套接字
s2.close()
UDP協(xié)議
- 介紹
- 用戶數(shù)據(jù)報(bào)協(xié)議,是一個(gè)無連接的簡單的面向數(shù)據(jù)報(bào)的運(yùn)輸層協(xié)議
- UDP數(shù)據(jù)包括目的端口號和源端口號信息,由于通訊不需要連接,所以可以實(shí)現(xiàn)廣播發(fā)送
- 優(yōu)點(diǎn)
- 傳輸速度快
- 有效傳輸?shù)臄?shù)據(jù)量最多為500bytes
- 缺點(diǎn)
- 發(fā)送數(shù)據(jù),無需對方確認(rèn)(不可靠)
- 容易丟包
- 應(yīng)用場景
- UDP廣泛應(yīng)用于需要相互傳輸數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用中,如QQ使用的就是UDP協(xié)議
- 在局域網(wǎng)中,如果要想局域網(wǎng)內(nèi)所有計(jì)算機(jī)發(fā)送數(shù)據(jù),可以使用廣播,廣播不能用TCP實(shí)現(xiàn),可以用UDP實(shí)現(xiàn)
**示例
**
**客戶端
**
import socket
# 創(chuàng)建UDP的套接字
udpSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 允許套接口傳送廣播信息,當(dāng)option_value不等于0時(shí),允許,否則,禁止
udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
port=33333
# ip 為廣播形式,也可以用255.255.255.25 表示全局域網(wǎng)都可以接收
network=''
# 發(fā)送廣播數(shù)據(jù)
udpSocket.sendto("我在發(fā)送數(shù)據(jù)!!".encode("utf-8"),(network,port))
# 關(guān)閉
udpSocket.close()
服務(wù)端
import socket
# 創(chuàng)建UDP的套接字
udpSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 允許套接口傳送廣播信息
udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
port=33333
# 綁定ip和端口,本機(jī)ip可以不寫
udpSocket.bind(('',port))
# 等待接收方發(fā)送數(shù)據(jù),1024表示本次接收的最大字節(jié)數(shù)
data,address=udpSocket.recvfrom(1024)
print("接收到的數(shù)據(jù)是:%s,地址是:%s"%(data.decode("utf-8"),str(address)))
# 關(guān)閉
udpSocket.close()
TCP協(xié)議
- 介紹
- TCP協(xié)議,是一種傳輸控制協(xié)議,是一種面向連接的,可靠的,基于字節(jié)流的傳輸層控制協(xié)議,由IETF的RFC 793定義
- TCP是一種點(diǎn)對點(diǎn)的傳輸方式
- TCP協(xié)議編寫的三個(gè)步驟:創(chuàng)建連接、數(shù)據(jù)傳遞、關(guān)閉連接
- TCP 通信模型中,在通信開始之前,一定要先建立相關(guān)的連接,才能發(fā)送數(shù)據(jù)
- 優(yōu)點(diǎn)
- 可靠,穩(wěn)定 TCP的可靠體現(xiàn)在TCP在傳遞數(shù)據(jù)之前,會有三次握手來建立連接
- 在數(shù)據(jù)傳遞時(shí),有確認(rèn)、重傳、擁塞控制機(jī)制
- 在數(shù)據(jù)傳完后,會斷開連接用來節(jié)約系統(tǒng)資源
- 缺點(diǎn)
- 慢,效率低,占用系統(tǒng)資源高
- 易被攻擊,TCP有確認(rèn)機(jī)制、三次握手機(jī)制,這些也導(dǎo)致TCP容易被人利用,實(shí)現(xiàn)DOS、DDOS、CC等攻擊
TCP與UDP的區(qū)別
- 面向連接
- TCP面向連接(如打電話要先撥號建立連接)
- UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
- 可靠
- TCP提供可靠的服務(wù)。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯(cuò),不丟失,不重復(fù),且按序到達(dá)
- UDP盡最大努力交付,不需要對方確認(rèn),即不保證可靠交付
- 字節(jié)流
- TCP面向字節(jié)流,實(shí)際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流
- UDP是面向報(bào)文的,UDP沒有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機(jī)的發(fā)送速率降低(對實(shí)時(shí)應(yīng)用很有用,如IP電話,實(shí)時(shí)視頻會議等)
- 連接性
- TCP連接只能是點(diǎn)到點(diǎn)的
- UDP支持一對一,一對多,多對一和多對多的交互通信
- 首部開銷
- TCP首部開銷20字節(jié)
- UDP首部開銷小,只有8個(gè)字節(jié)
- 信道
- TCP的邏輯通信信道是全雙工的可靠信道
- UDP則是不可靠信道
示例
服務(wù)端
import socket
# 創(chuàng)建tcp 的套接字
tcp_socekt=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# ip與端口,本機(jī)ip可以不寫
addr=('',44444)
# 綁定地址
tcp_socekt.bind(addr)
# 使用socket創(chuàng)建的套接字默認(rèn)的屬性是 主動的,使用 listen 將其變?yōu)楸粍樱@樣就可以接收別人的連接了, 128表示允許的最大連接數(shù)
tcp_socekt.listen(128)
# 如果有一個(gè)新的客戶端來連接服務(wù)器,那么就產(chǎn)生一個(gè)新的套接字專門為這個(gè)客戶端服務(wù)
# client_socket 用來為這個(gè)客戶端服務(wù)
# tcp_socket 就可以用來專門等待其他新客戶端的鏈接
client_socket,client_addr=tcp_socekt.accept()
# 接收對方發(fā)過來的數(shù)據(jù)
data=client_socket.recv(1024)
print("接收到的數(shù)據(jù)是:%s,地址是:%s"%(data.decode("utf-8"),str(client_addr)))
# 發(fā)送數(shù)據(jù)到客戶端
client_socket.send("hello....".encode("utf-8"))
# 關(guān)閉為這個(gè)客戶端服務(wù)的套接字,一旦關(guān)閉,就意味著不能再為這個(gè)客戶端服務(wù)了
client_socket.close()
# 關(guān)閉外面總的 套接字,一旦關(guān)閉,則意味著不再接收任何連接了
tcp_socekt.close()
客戶端
import socket
# 創(chuàng)建tcp 套接字
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 目標(biāo)服務(wù)器地址
dest_addr=("127.0.0.1",44444)
# 連接目標(biāo)服務(wù)器
tcp_socket.connect(dest_addr)
# 發(fā)送數(shù)據(jù)
tcp_socket.send("我是客戶端".encode("utf-8"))
# 接收對方發(fā)過來的數(shù)據(jù),最大接收1024個(gè)字節(jié)
data=tcp_socket.recv(1024)
print("接收到的數(shù)據(jù)是:%s"%data.decode("utf-8"))
# 關(guān)閉套接字
tcp_socket.close()
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7599瀏覽量
89249 -
工具
+關(guān)注
關(guān)注
4文章
314瀏覽量
27911 -
輔助
+關(guān)注
關(guān)注
0文章
8瀏覽量
10530
發(fā)布評論請先 登錄
相關(guān)推薦
Labview與Python的網(wǎng)絡(luò)編程
Labview素有測試之王的美譽(yù),圖形化編程和快速搭建自動化平臺讓人愛不釋手。但是Labview不能在安卓平臺上運(yùn)行,開發(fā)web也力不從心。如果labview配合上Python簡直就如虎添翼了
發(fā)表于 11-12 13:48
Python學(xué)習(xí)之網(wǎng)絡(luò)編程Socket分享
Python學(xué)習(xí)之網(wǎng)絡(luò)編程Socket
發(fā)表于 07-02 08:18
請問python-樹莓派如何通過按鍵控制步進(jìn)電機(jī)正反轉(zhuǎn)?
步進(jìn)電機(jī)驅(qū)動原理是什么?python-樹莓派如何通過按鍵控制步進(jìn)電機(jī)正反轉(zhuǎn)?
發(fā)表于 10-09 08:45
設(shè)計(jì)多網(wǎng)絡(luò)協(xié)議的Python網(wǎng)絡(luò)編程的探索性指南
很高興看到本書出版了,我要感謝所有為本書的出版做出貢獻(xiàn)的人。本書是Python網(wǎng)絡(luò)編程方面的探索性指南,涉及了很多網(wǎng)絡(luò)協(xié)議
發(fā)表于 09-14 10:47
?5次下載
python-速成指南
python 提供好用的兩個(gè)容器:list 和 dict。插句題外話,其實(shí)最好用的容器還是 PHP 提供的關(guān)聯(lián)數(shù)組,一個(gè)數(shù)組就包括了 python 中 list 和 dict 的全部功能,實(shí)在是很贊。
發(fā)表于 03-28 16:32
?9次下載
如何搭建Python編程環(huán)境
Python是一種高級編程語言,被廣泛用于科學(xué)計(jì)算、數(shù)據(jù)分析、人工智能、Web開發(fā)等領(lǐng)域。想要學(xué)習(xí)Python編程,首先需要搭建一個(gè)合適的編程
網(wǎng)絡(luò)工程師學(xué)Python-遠(yuǎn)程連接管理Telnet
Python Telnet是一種用于遠(yuǎn)程連接和管理網(wǎng)絡(luò)設(shè)備的Python庫。
如何使用Python進(jìn)行神經(jīng)網(wǎng)絡(luò)編程
。 為什么使用Python? Python是一種廣泛使用的高級編程語言,以其易讀性和易用性而聞名。Python擁有強(qiáng)大的庫,如TensorFlow、Keras和PyTorch,這些庫提
Python編程:處理網(wǎng)絡(luò)請求的代理技術(shù)
在網(wǎng)絡(luò)編程中,代理技術(shù)扮演著至關(guān)重要的角色,尤其在處理網(wǎng)絡(luò)請求時(shí)。通過代理服務(wù)器,我們可以實(shí)現(xiàn)請求的轉(zhuǎn)發(fā)、緩存、負(fù)載均衡以及安全控制等功能。Python作為一種功能強(qiáng)大的
評論