python網路程式設計基礎

2021-10-02 00:12:52 字數 4670 閱讀 7932

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更多的功...