ip位址用於在網路中找到目標
192.168.33.xx
前三個數是網路號,xx表示主機號,網路號相同表示在同乙個網路中,xx從0~255,其中0和255號不能用,如果不夠用,將33作為主機號,可以有256*256臺主機,以此類推
(2)私有ip
私有ip用於區域網,不能在公網中使用
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
(3)本機ip
127.0.0.1可以代表本機ip機制,用可以測試本機配置的web伺服器
也可以通過127.0.0.1進行同一臺電腦上不同程式(埠)之間的通訊
網路層ip位址用於定位目標主機,傳輸層「協議+埠(port)」用於定位目標主機上的目標程序,「ip位址+協議+埠」可以標識網路中的程序知名的埠號為0到1023,可能會被占用,私有的埠號盡量往大寫
80埠分配給http服務
21埠分配給ftp服務
動態埠範圍:1024~66635,不固定分配給某種服務,動態分配
動態分配:乙個系統程式或者應用程式需要網路通訊時,可以向主機申請乙個埠,主機從可用的埠中分配埠,程式關閉時,埠號釋放
socket是程序間通訊的方式,與其他程序間通訊不同在於:socket可以實現不同主機間的程序間通訊、
(1)建立socket
建立tcp套接字物件
s=socket.socket(socket.af_inet,socket.sock_stream)
建立udp套接字物件
s=socket.socket(socket.af_inet,socket.sock_dgram)
(2)使用套接字收發資料
s.sendto("***".encode("utf-8),(ip,port)) #傳送資料
s.recvform(1024) #接受資料
(3)關閉socket
s.close()
udp通訊不需要建立連線,只需要傳送資料
傳送程式
import socket
def main():
#建立udp套接字
udp_socket=socket.socket(socket.af_inet,socket.sock_dgram)
udp_socket.bind(("",7878)) #若傳送端沒有繫結埠,則系統會隨機給乙個埠號,乙個埠只能用於乙個程序
#目標的ip和埠
dest_ip=('127.0.0.1',7878)
#獲取資料
send_data=input("請輸入要傳送的資料")
#傳送資料到指定電腦上的指定程式,資料內容+目標主機和埠
udp_socket.sendto(send_data.encode("utf-8"),dest_ip) #只能傳送位元組,需要將傳送的內容進行utf-8編碼
#關閉套接字
udp_socket.close()
if __name__=="__main__":
main()
接收程式
import socket
def main():
#1、建立udp套接字
udp_socket=socket.socket(socket.af_inet,socket.sock_dgram)
#2、繫結本地的ip和埠號,如果乙個程式不繫結,系統會隨機分配埠,不能保證每次訪問都是同乙個埠
local_addr=('',7878) #ip和埠號,ip一般不寫表示本地的任何乙個ip,不能寫成其他電腦的ip
udp_socket.bind(local_addr)
#3、等待接收對方傳送的資料,返回是個元組,包括(資訊內容,(傳送方的ip,port))
recv_data,from_addr=udp_socket.recvfrom(1024) #1024表示本次接收的最大位元組數,recvfrom當沒有接受到資料時會阻塞
recv_msg=recv_data.decode('gbk') #解碼,windows中中文的解碼格式為gbk
print(recv_msg)
#關閉套接字
udp_socket.close()
if __name__=="__main__":
main()
乙個套接字可以同時收發訊號,socket套接字屬於全雙工當傳送方傳送資料後,資料會先存在作業系統中,接收方進行recvfrom時,從系統中讀取資料,
當對方沒有傳送資料時,接受方進行recvfrom,一直阻塞,直到作業系統中接收到資料
面向連線的可靠的、基於位元組流的傳輸層通訊協議
傳送資料前需要建立連線,雙方的資料傳輸都可以通過這乙個連線進行
完成資料交換後,雙方必須斷開連線,釋放資源
(1)tcp與udp不同點
(3)客戶端client.py
import socket
def main():
#1|建立tcp套接字
tcp_client=socket.socket(socket.af_inet,socket.sock_stream)
#目標資訊
server_ip=input("請輸入伺服器ip:")
server_port=int(input("請輸入伺服器port:"))
#2、連線伺服器
tcp_client.connect((server_ip,server_port))
while(true):
#輸入資料
send_data=input("請輸入要傳遞的資料:")
#3、傳送資料
tcp_client.send(send_data.encode("gbk"))
if (send_data == "exit"):
break
#4、接受對方發來的資料,最大接受1024個位元組
recv_data=tcp_client.recv(1024)
print(recv_data)
#5、關閉套接字
tcp_client.close()
if __name__=="__main__":
main()
(4)伺服器server.py
import socket
def main():
#建立tcp套接字
tcp_socket_server=socket.socket(socket.af_inet,socket.sock_stream)
#bind 繫結ip和port
tcp_socket_server.bind(("",7877))
#listen 使套接字變為可以被動連線
tcp_socket_server.listen(128) #這裡的128數字大與小會影響同一時刻連線的客戶端的數量
while(true): #迴圈等待新的客戶端
#tcp_socket_server.accept()只負責等待新客戶端的連線,不負責服務客戶端------阻塞
#如果有新的客戶端來連線伺服器,就會產生新的套接字專門為這個客戶端服務
#client_socket是乙個分配出來的新的套接字,用來為這個客戶端服務,tcp_socket_server可以用來專門等待其他的新客戶端連線
#client_addr是連線的客戶端的ip
client_socker,client_addr=tcp_socket_server.accept()
print("客戶端連線成功")
while(true): #迴圈為乙個客戶端服務
#接受資料
recv_data=client_socker.recv(1024) #如果recv解堵塞,1、客戶端傳送了資料 2、客戶端呼叫了close,recv為空
recv_msg=recv_data.decode('gbk')
print(recv_msg)
print(client_addr)
if recv_msg: #當接收到資料時回應,如果recv_msg為空,則說明客戶端關閉
# 傳送資料到客戶端
client_socker.send("hello".encode('gbk'))
else:
break
#關閉這個客戶端的套接字,關閉後就不能為這個客戶端服務
client_socker.close()
if __name__=="__main__":
main()
python網路程式設計基礎
客戶 伺服器架構 伺服器 是乙個軟體或硬體,用於提供客戶需要的 服務 伺服器存在的唯一目的就是等待客戶的請求,給這些客戶服務,然後再等待其他的請求.常見的服務型別 硬體的客戶 伺服器架構 印表機,檔案伺服器 軟體客戶 伺服器架構 web伺服器,資料庫伺服器,視窗伺服器 gui 套接字 用於程序間通訊...
python 網路程式設計基礎
python實在是太方便,太易用了,三方庫的支援又全,語法又簡單,對開發人員來說,實在是居家旅行,x的必備利器。週末研究了下python的網路支援,做一下記錄,以備隨後翻閱。python支援bsd的socket進行網路程式設計,其api跟c中的大同小異,先看看tcp方式的,說到網路程式設計,肯定會設...
python網路程式設計基礎
目錄 標籤 空格分隔 網路程式設計 目錄tcp和udp tcp的使用是面向連線的,即資料的傳輸必須基於虛鏈路的完整建立。虛鏈路的建立提供了很多優秀的功能,比如確認重傳以保證資料的完整性,滑動視窗以保證資料傳輸的高效性,各類選項字段提供不同的可選功能。tcp的缺點是報頭大,因為需要包含比udp更多的功...