python可以用来编写计算机网络程序吗_计算机网络(基于python做的笔记 )
計算機網絡(UDP 和 TCP)
概述
為了讓在不同的電腦上運行的軟件,之間能夠互相傳遞數據,就需要借助網絡的功能
使用網絡能夠把多方鏈接在一起,然后可以進行數據傳遞
所謂的網絡編程就是,讓在不同的電腦上的軟件能夠進行數據傳遞,即進程之間的通信
IP地址
IP地址的作用
用在網絡中標記一臺電腦,比如:192.168.1.1,在本地局域網上是唯一的。
IP地址的分類
每一個IP地址包括兩部分:網絡地址和主機地址
IP地址的查看
linux系統: 終端輸入ifconfig win:ipconfig
測試遠程主機連通性: ping + IP地址
端口
如果一個程序需要收發網絡數據,那么就需要有端口
端口號
端口是通過端口號來標記的,端口號只有整數,范圍是從0到65535
端口分類
** 知名端口(Well Known Ports)
知名端口是眾所周知的端口號,范圍從0到1023
80端口分配給HTTP服務
21端口分配給FTP服務
** 動態端口(Dynamic Ports)
動態端口的范圍是從1024到65535
之所以稱為動態端口,是因為它一般不固定分配某種服務,而是動態分配。
動態分配是指當一個系統程序或應用程序程序需要網絡通信時,它向主機申請一個端口,主機從可用的端口號中分配一個供它使用。
當程序關了的時候,端口號也就釋放了
socket 簡介
“協議+端口”可以唯一標識主機中的應用進程(進程)。
socket(簡稱 套接字) 是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:
它能實現不同主機間的進程間通信,我們網絡上各種各樣的服務大多都是基于 Socket 來完成通信的
創建socket
import socket
socket.socket(AddressFamily, Type)
Address Family : 可以選擇 AF_INET(用于 Internet 進程間通信) 或者 AF_UNIX(用于同一臺機器進程間通信),實際工作中常用AF_INET
Type:套接字類型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 協議)或者 SOCK_DGRAM(數據報套接字,主要用于 UDP 協議)
創建一個tcp socket(tcp套接字)
import socket
# 創建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ...這里是使用套接字的功能(省略)...
# 不用的時候,關閉套接字
s.close()
創建一個udp socket(udp套接字)
import socket
# 創建udp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# ...這里是使用套接字的功能(省略)...
# 不用的時候,關閉套接字
s.close()
UDP
創建一個基于udp的網絡程序流程很簡單,具體步驟如下:
1、創建客戶端套接字
2、發送/接收數據
3、關閉套接字
udp 聊天器
import socket
def send_msg(udp_socket):
"""獲取鍵盤數據,并將其發送給對方"""
# 1. 從鍵盤輸入數據
msg = input("\n請輸入要發送的數據:")
# 2. 輸入對方的ip地址
dest_ip = input("\n請輸入對方的ip地址:")
# 3. 輸入對方的port
dest_port = int(input("\n請輸入對方的port:"))
# 4. 發送數據
udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
"""接收數據并顯示"""
# 1. 接收數據
recv_msg = udp_socket.recvfrom(1024)
# 2. 解碼
recv_ip = recv_msg[1]
recv_msg = recv_msg[0].decode("utf-8")
# 3. 顯示接收到的數據
print(">>>%s:%s" % (str(recv_ip), recv_msg))
def main():
# 1. 創建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 綁定本地信息
udp_socket.bind(("", 7890))
while True:
# 3. 選擇功能
print("="*30)
print("1:發送消息")
print("2:接收消息")
print("="*30)
op_num = input("請輸入要操作的功能序號:")
# 4. 根據選擇調用相應的函數
if op_num == "1":
send_msg(udp_socket)
elif op_num == "2":
recv_msg(udp_socket)
else:
print("輸入有誤,請重新輸入...")
if __name__ == "__main__":
main()
TCP
TCP協議,傳輸控制協議(英語:Transmission Control Protocol,縮寫為 TCP)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議,由IETF的RFC 793定義。
TCP特點
1、面向連接
通信雙方必須先建立連接才能進行數據的傳輸,雙方都必須為該連接分配必要的系統內核資源,以管理連接的狀態和連接上的傳輸。
雙方間的數據傳輸都可以通過這一個連接進行。
完成數據交換后,雙方必須斷開此連接,以釋放系統資源。
連接是一對一的,因此TCP不適用于廣播的應用程序,基于廣播的應用程序請使用UDP協議。
2、可靠傳輸
1)TCP采用發送應答機制
TCP發送的每個報文段都必須得到接收方的應答才認為這個TCP報文段傳輸成功
2)超時重傳
發送端發出一個報文段之后就啟動定時器,如果在定時時間內沒有收到應答就重新發送這個報文段。
TCP為了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的包發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那么對應的數據包就被假設為已丟失將會被進行重傳。
3)錯誤校驗
TCP用一個校驗和函數來檢驗數據是否有錯誤;在發送和接收時都要計算校驗和。
4) 流量控制和阻塞管理
流量控制用來避免主機發送得過快而使接收方來不及完全收下。
TCP通信模型
文件下載器
from socket import *
import sys
def get_file_content(file_name):
"""獲取文件的內容"""
try:
with open(file_name, "rb") as f:
content = f.read()
return content
except:
print("沒有下載的文件:%s" % file_name)
def main():
if len(sys.argv) != 2:
print("請按照如下方式運行:python3 xxx.py 7890")
return
else:
# 運行方式為python3 xxx.py 7890
port = int(sys.argv[1])
# 創建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
# 本地信息
address = ('', port)
# 綁定本地信息
tcp_server_socket.bind(address)
# 將主動套接字變為被動套接字
tcp_server_socket.listen(128)
while True:
# 等待客戶端的鏈接,即為這個客戶端發送文件
client_socket, clientAddr = tcp_server_socket.accept()
# 接收對方發送過來的數據
recv_data = client_socket.recv(1024) # 接收1024個字節
file_name = recv_data.decode("utf-8")
print("對方請求下載的文件名為:%s" % file_name)
file_content = get_file_content(file_name)
# 發送文件的數據給客戶端
# 因為獲取打開文件時是以rb方式打開,所以file_content中的數據已經是二進制的格式,因此不需要encode編碼
if file_content:
client_socket.send(file_content)
# 關閉這個套接字
client_socket.close()
# 關閉監聽套接字
tcp_server_socket.close()
if __name__ == "__main__":
main()
客戶端 參考代碼如下:
from socket import *
def main():
# 創建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))
# 輸入需要下載的文件名
file_name = input("請輸入要下載的文件名:")
# 發送文件下載請求
tcp_client_socket.send(file_name.encode("utf-8"))
# 接收對方發送過來的數據,最大接收1024個字節(1K)
recv_data = tcp_client_socket.recv(1024)
# print('接收到的數據為:', recv_data.decode('utf-8'))
# 如果接收到數據再創建文件,否則不創建
if recv_data:
with open("[接收]"+file_name, "wb") as f:
f.write(recv_data)
# 關閉套接字
tcp_client_socket.close()
if __name__ == "__main__":
main()
標簽:udp,socket,python,筆記,計算機網絡,TCP,file,接字,recv
總結
以上是生活随笔為你收集整理的python可以用来编写计算机网络程序吗_计算机网络(基于python做的笔记 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python常用库有哪些餐厅_Pytho
- 下一篇: python命令行参数作用_Python