1. 程式人生 > >06網絡通信udp-tcp、正則

06網絡通信udp-tcp、正則

打電話 位置 開始 end rfc 獲取數據 替換 控制 prot

一. udp網絡程序

1. udp網絡程序-發送數據

1)創建客戶端套接字

2)發送/接收數據

3)關閉套接字

from socket import *

 

# 1. 創建udp套接字

udp_socket = socket(AF_INET, SOCK_DGRAM)

 

# 2. 準備接收方的地址

# ‘192.168.1.103‘表示目的ip地址

# 8080表示目的端口

dest_addr = (192.168.1.103, 8080)  # 註意 是元組,ip是字符串,端口是數字

 

# 3. 從鍵盤獲取數據

send_data = input("請輸入要發送的數據:
") # 4. 發送數據到指定的電腦上的指定程序中 udp_socket.sendto(send_data.encode(utf-8), dest_addr) # 5. 關閉套接字 udp_socket.close() 在windows中運行“網絡調試助手”

2. 發送、接收數據

from socket import *

 

# 1. 創建udp套接字

udp_socket = socket(AF_INET, SOCK_DGRAM)

 

# 2. 準備接收方的地址

dest_addr = (192.168.236.129, 8080)

 

# 3. 從鍵盤獲取數據 send_data = input("請輸入要發送的數據:") # 4. 發送數據到指定的電腦上 udp_socket.sendto(send_data.encode(utf-8), dest_addr) # 5. 等待接收對方發送的數據 recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字節數 # 6. 顯示對方發送的數據 # 接收到的數據recv_data是一個元組 # 第1個元素是對方發送的數據 # 第2個元素是對方的ip和端口 print(recv_data[0].decode(
gbk)) print(recv_data[1]) # 7. 關閉套接字 udp_socket.close()

3. udp綁定信息

一般情況下,在一臺電腦上運行的網絡程序有很多,為了不與其他的網絡程序占用同一個端口號,往往在編程中,udp的端口號一般不綁定;但是如果需要做成一個服務器端的程序的話,是需要綁定的。

from socket import *
 
# 1. 創建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
 
# 2. 綁定本地的相關信息,如果一個網絡程序不綁定,則系統會隨機分配
local_addr = (‘‘, 7788) #  ip地址和端口號,ip一般不用寫,表示本機的任何一個ip
udp_socket.bind(local_addr)
 
# 3. 等待接收對方發送的數據
recv_data = udp_socket.recvfrom(1024) #  1024表示本次接收的最大字節數
 
# 4. 顯示接收到的數據
print(recv_data[0].decode(gbk))
 
# 5. 關閉套接字
udp_socket.close()

二. Python3編碼轉換

1. str->bytes:encode編碼

text = ‘我是文本‘

bytesText = text.encode()

2. bytes->str:decode解碼

bytesText.decode()

三. tcp網絡程序

1. 概念

1)TCP協議,傳輸控制協議(英語:Transmission Control Protocol,縮寫為 TCP)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,由IETF的RFC 793定義。

2)TCP通信需要經過創建連接、數據傳送、終止連接三個步驟。

3)TCP通信模型中,在通信開始之前,一定要先建立相關的鏈接,才能發送數據,類似於生活中,"打電話""

2. 特點

2.1 面向連接

通信雙方必須先建立連接才能進行數據的傳輸,雙方都必須為該連接分配必要的系統內核資源,以管理連接的狀態和連接上的傳輸。

雙方間的數據傳輸都可以通過這一個連接進行。

完成數據交換後,雙方必須斷開此連接,以釋放系統資源。

這種連接是一對一的,因此TCP不適用於廣播的應用程序,基於廣播的應用程序請使用UDP協議。

2.2 可靠傳輸

1)TCP采用發送應答機制:TCP發送的每個報文段都必須得到接收方的應答才認為這個TCP報文段傳輸成功

2)超時重傳:發送端發出一個報文段之後就啟動定時器,如果在定時時間內沒有收到應答就重新發送這個報文段。

TCP為了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的包發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那麽對應的數據包就被假設為已丟失將會被進行重傳。

3)錯誤校驗:TCP用一個校驗和函數來檢驗數據是否有錯誤;在發送和接收時都要計算校驗和。

4) 流量控制和阻塞管理:流量控制用來避免主機發送得過快而使接收方來不及完全收下。

3. 與udp區別

1)udp不需要建議相關的連接,只需要發送數據

2)tcp在通信開始之前,一定要先建立相關的鏈接,才能發送數據

4. tcp客戶端

from socket import *

 

# 創建socket

tcp_client_socket = socket(AF_INET, SOCK_STREAM)

 

# 目的信息

server_ip = input("請輸入服務器ip:")

server_port = int(input("請輸入服務器port:"))

 

# 鏈接服務器

tcp_client_socket.connect((server_ip, server_port))

 

# 提示用戶輸入數據

send_data = input("請輸入要發送的數據:")

 

tcp_client_socket.send(send_data.encode("gbk"))

 

# 接收對方發送過來的數據,最大接收1024個字節

recvData = tcp_client_socket.recv(1024)

print(接收到的數據為:, recvData.decode(gbk))

 

# 關閉套接字

tcp_client_socket.close()

5. tcp服務器

1)socket創建一個套接字

2) bind綁定ip和port

3) listen使套接字變為可以被動鏈接

4) accept等待客戶端的鏈接

5) recv/send接收發送數據

from socket import *
 
# 創建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
 
# 本地信息
address = (‘‘, 7788)
 
# 綁定
tcp_server_socket.bind(address)
 
# 使用socket創建的套接字默認的屬性是主動的,使用listen將其變為被動的,這樣就可以接收別人的鏈接了
tcp_server_socket.listen(128)
 
# 如果有新的客戶端來鏈接服務器,那麽就產生一個新的套接字專門為這個客戶端服務
# client_socket用來為這個客戶端服務
# tcp_server_socket就可以省下來專門等待其他新客戶端的鏈接
client_socket, clientAddr = tcp_server_socket.accept()
 
# 接收對方發送過來的數據
recv_data = client_socket.recv(1024)  # 接收1024個字節
print(接收到的數據為:, recv_data.decode(gbk))
 
# 發送一些數據到客戶端
client_socket.send("thank you !".encode(gbk))
 
# 關閉為這個客戶端服務的套接字,只要關閉了,就意味著為不能再為這個客戶端服務了,如果還需要服務,只能再次重新連接
client_socket.close()
 

listen後的套接字是被動套接字,用來接收新的客戶端的鏈接請求的,而accept返回的新套接字是標記這個新客戶端的

四. 正則表達式

1. 匹配單個字符

技術分享圖片

2. 匹配多個字符

技術分享圖片

3. 匹配開頭結尾

技術分享圖片

示例:

技術分享圖片

4. 匹配分組

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

5. 正則的高級用法

1) search 可以匹配字符串中的任意位置,只要出現與正則表達式相匹配的表達式就行,group()之後返回匹配成功的部分,只能取第一塊符合的

2) findall 類似上一個,返回所有符合的

3) sub 先匹配,然後替換(替換的部分也可以是一個函數)

ret = re.sub(r"\d+", 998, "python = 997")

python=998

技術分享圖片

6. split

import re
 
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)

輸出:

[‘info‘, ‘xiaoZhang‘, ‘33‘, ‘shandong‘]

06網絡通信udp-tcp、正則